← К каталогу
Исходный код · ID 262

LSMA_EA

lsma_ea.mq4
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Этот торговый советник для платформы MetaTrader 4 использует индикатор LSMA (Least Squares Moving Average) для формирования сигналов на вход и выход из сделок. Советник рассчитывает разницу между двумя линиями LSMA, сдвинутыми на разные периоды, и сравнивает её с заданными порогами для принятия решений о покупке или продаже. Поддерживается управление размером лота как фиксированным значением, так и через встроенные механизмы управления рисками. Советник работает с ордерами типа buy и sell, устанавливает стоп-лосс и тейк-профит, а также контролирует количество открытых позиций по одному символу.

Настройки программы

НастройкаОписание
Expert_Name Имя советника — Текстовый идентификатор советника, используется в комментариях к ордерам.
MagicNumberBase База магического числа — Целочисленное базовое значение, из которого формируется уникальный магический номер для ордеров с учётом символа и таймфрейма.
UserComment Комментарий пользователя — Текстовый комментарий, присваиваемый каждому открываемому ордеру.
in Разделитель настроек индикатора — Текстовый разделитель, группирующий параметры, связанные с расчётом индикатора.
p Группа типов цены — Текстовый заголовок группы, описывающий доступные варианты применяемой цены.
p0 Тип цены — Close — Вариант применяемой цены: цена закрытия свечи.
p1 Тип цены — Open — Вариант применяемой цены: цена открытия свечи.
p2 Тип цены — High — Вариант применяемой цены: максимальная цена свечи.
p3 Тип цены — Low — Вариант применяемой цены: минимальная цена свечи.
p4 Тип цены — Median — Вариант применяемой цены: среднее между высоким и низким ценой.
p5 Тип цены — Typical — Вариант применяемой цены: среднее из высокого, низкого и цен закрытия.
p6 Тип цены — Weighted — Вариант применяемой цены: взвешенное среднее по четырём ценам свечи.
LSMA_Period Период LSMA — Период расчёта линии регрессии LSMA, используемой для формирования сигналов.
LSMA_AppliedPrice Применяемая цена LSMA — Целочисленный индекс типа цены, используемой при расчёте LSMA (соответствует одному из вариантов p0–p6).
What size angle to trigger a trade (EntryDif_Threshold) Порог входа — Числовое значение углового разделения LSMA, при превышении которого генерируется сигнал на вход в сделку.
ExitDif_Threshold Порог выхода — Числовое значение углового разделения LSMA, при котором срабатывает условие закрытия позиции.
PrevMAShift Сдвиг предыдущей MA — Сдвиг относительно текущего бара для расчёта предыдущего значения LSMA.
CurMAShift Сдвиг текущей MA — Сдвиг относительно текущего бара для расчёта текущего значения LSMA.
mm Разделитель настроек управления денежными средствами — Текстовый разделитель, группирующий параметры управления размером позиции.
Lots Размер лота — Фиксированный размер лота для каждой сделки при отключённом управлении рисками.
MaxLots Максимальный лот — Верхний предел размера лота, который не может быть превышен при расчёте.
Change to false to shutdown money management controls. (UseMoneyManagement) Использовать управление рисками — Переключатель: при значении true размер лота рассчитывается автоматически, при false используется фиксированное значение Lots.
BrokerIsIBFX Брокер IBFX — Переключатель, активирующий специальную корректировку размера лота для брокера IBFX.
m1 Подсказка по типу счёта — Текстовая подсказка о необходимости отключения мини- и микро-счетов для стандартного аккаунта.
fm Подсказка по свободному марже — Текстовая подсказка: при UseFreeMargin=false для расчёта лота используется баланс счёта.
UseFreeMargin Использовать свободный маржу — Переключатель: при true расчёт лота базируется на свободном марже, при false — на балансе счёта.
Change to whatever percent of equity you wish to risk. (TradeSizePercent) Процент риска — Процент от средств счёта, используемый при автоматическом расчёте размера лота.
BrokerPermitsFractionalLots Брокер разрешает дробные лоты — Переключатель, определяющий, допускает ли брокер дробные значения лота.
st6 Разделитель настроек контроля прибыли — Текстовый разделитель, группирующий параметры стоп-лосса, тейк-профита и проскальзывания.
StopLoss Стоп-лосс — Размер стоп-лосса в пунктах для каждой сделки; ноль означает отсутствие стоп-лосса.
TakeProfit Тейк-профит — Размер тейк-профита в пунктах для каждой сделки; ноль означает отсутствие тейк-профита.
Slippage Проскальзывание — Максимально допустимое проскальзывание в пунктах при открытии и закрытии ордеров.
db0 Разделитель одноразового запуска — Текстовый разделитель для группы настроек одноразового запуска на бар.
db1 Подсказка по стоп-лоссу — Текстовая подсказка о необходимости отключить UseOncePerBar при использовании стоп-лосса.
db2 Подсказка по тейк-профиту — Текстовая подсказка о необходимости отключить UseOncePerBar при использовании тейк-профита или трейлинг-стопа.
UseOncePerBar Одноразовый запуск на бар — Переключатель: при true советник выполняет торговые операции не более одного раза на завершённый бар.
Получить полный код

Поиск по коду файла

#include <stdlib.mqh>

extern string  Expert_Name    = "LSMA_EA";
extern int     MagicNumberBase = 200000;
extern string  UserComment = "LSMA_EA";
extern string  in="---Indicator settings---";
extern string  p = "--Applied Price Types--";
extern string  p0 = " 0 = close";
extern string  p1 = " 1 = open";
extern string  p2 = " 2 = high";
extern string  p3 = " 3 = low";
extern string  p4 = " 4 = median(high+low)/2";
extern string  p5 = " 5 = typical(high+low+close)/3";
extern string  p6 = " 6 = weighted(high+low+close+close)/4";
extern int     LSMA_Period=7;
extern int     LSMA_AppliedPrice = 0;
extern double  EntryDif_Threshold=10;   // What size angle to trigger a trade
extern double  ExitDif_Threshold=2;
extern int     PrevMAShift=3;
extern int     CurMAShift=1;

extern string  mm = "---Money Management---";
extern double  Lots=1.0;
extern double  MaxLots = 100;
extern bool    UseMoneyManagement = true; // Change to false to shutdown money management controls.
extern bool    BrokerIsIBFX = false;
extern string  m1="Set mini and micro to false for standard account";
extern bool    AccountIsMini = false;
extern bool    AccountIsMicro = false;
extern string  fm="UseFreeMargin = false to use Account Balance";
extern bool    UseFreeMargin = false;
extern double  TradeSizePercent = 10;  // Change to whatever percent of equity you wish to risk.
extern bool    BrokerPermitsFractionalLots = true;

extern string  st6 = "--Profit Controls--";
extern double  StopLoss=0;
extern double  TakeProfit=0;
extern int     Slippage=3;
extern string  db0="---Flag to run start once per bar---";
extern string  db1=" Set to false when using stoploss";
extern string  db2=" takeprofit or trailing stop";
extern bool    UseOncePerBar = true;

int            MagicNumber=0;
string         setup;
int            TradesInThisSymbol = 0;
double         mLots=0;
datetime       timeprev = 0;

int init()
{
      // код доступен только после оплаты
   }

int deinit()
{
 return(0);
}

double LSMA(int Rperiod, int prMode, int shift)
{
   int i, myShift;
   double sum, pr;
   int length;
   double lengthvar;
   double tmp;
   double wt;

   length = Rperiod;

   sum = 0;
   for(i = length; i >= 1  ; i--)
   {
     lengthvar = length + 1;
     lengthvar /= 3;
     tmp = 0;
     myShift = length - i + shift;
     switch (prMode)
     {
     case 0: pr = iClose(NULL,0,myShift);break;
     case 1: pr = iOpen(NULL,0,myShift);break;
     case 2: pr = iHigh(NULL,0,myShift);break;
     case 3: pr = iLow(NULL,0,myShift);break;
     case 4: pr = (iHigh(NULL,0,myShift) + iLow(NULL,0,myShift))/2;break;
     case 5: pr = (iHigh(NULL,0,myShift) + iLow(NULL,0,myShift) + iClose(NULL,0,myShift))/3;break;
     case 6: pr = (iHigh(NULL,0,myShift) + iLow(NULL,0,myShift) + iClose(NULL,0,myShift) + iClose(NULL,0,myShift))/4;break;
     }
     tmp = ( i - lengthvar)*pr;
     sum+=tmp;
    }
    wt = sum*6/(length*(length+1));
    wt = MathFloor(wt/Point)*Point;

    return(wt);
}

double MA_Dif( int PrevShift, int CurShift)
{
   double fDif, mFactor;
   double fCurMA, fPrevMA;
   string Sym;
   int ShiftDif;

   mFactor = 100000.0;
   Sym = StringSubstr(Symbol(),3,3);
   if (Sym == "JPY") mFactor = 1000.0;
   ShiftDif = PrevShift-CurShift;
   mFactor /= ShiftDif; 
   fCurMA=LSMA(LSMA_Period,LSMA_AppliedPrice,CurShift);
   fPrevMA=LSMA(LSMA_Period,LSMA_AppliedPrice,PrevShift);

   fDif = mFactor * (fCurMA - fPrevMA)/2.0;

    return(fDif);
}

bool CheckExitCondition(int cmd)
{
	double maDif;

	maDif = MA_Dif(PrevMAShift, CurMAShift);
   switch (cmd)
   {
      case OP_BUY : if (maDif < ExitDif_Threshold) return(true);
                    break;
      case OP_SELL : if (maDif > -ExitDif_Threshold) return(true);
   }

   return(false);
}

bool CheckEntryCondition(int cmd)
{

	double maDif;

	maDif = MA_Dif(PrevMAShift, CurMAShift);
   switch (cmd)
   {
      case OP_BUY : if (maDif > EntryDif_Threshold) return(true);
                    break;
      case OP_SELL : if (maDif < -EntryDif_Threshold) return(true);
   }

   return(false);

}

int start()
{
      // код доступен только после оплаты
   }

double GetLots()
{
   double lot;

   if(UseMoneyManagement == true)
   {
     lot = LotsOptimized();
   }
   else
   {
      lot = Lots;
   }

   if (AccountIsMicro == true)
   {
      if (lot < 0.01) lot = 0.01;
      if (lot > MaxLots) lot = MaxLots * 100;
      if (BrokerIsIBFX == true) lot = lot * 10;
      return(lot);
   }

   if(AccountIsMini == true)
   {
      if (lot < 0.1) lot = 0.1;
      if (lot > MaxLots) lot = MaxLots;
      if (BrokerIsIBFX == true) lot = lot * 10;
      return(lot);
   }

   if( BrokerPermitsFractionalLots == false)
   {
      if (lot >= 1.0) lot = MathFloor(lot); else lot = 1.0;
   }

   if (lot > MaxLots) lot = MaxLots;

   return(lot);
}

double LotsOptimized()
  {
   double lot=Lots;

   if (UseFreeMargin == true)
        lot=NormalizeDouble(MathFloor(AccountFreeMargin()*TradeSizePercent/10000)/10,1);
   else
        lot=NormalizeDouble(MathFloor(AccountBalance()*TradeSizePercent/10000)/10,1);

  if(AccountIsMini == true)
  {
    lot = MathFloor(lot*10)/10;
  }

   return(lot);
} 

int OpenBuyOrder(double mLots, double mStopLoss, double mTakeProfit, int mSlippage, string mComment, int mMagic, color mColor)
{
   int err,ticket;
   double myPrice, myStopLoss = 0, myTakeProfit = 0;

   RefreshRates();
   myStopLoss = StopLong(Bid,mStopLoss);
   myTakeProfit = TakeLong(Bid,mTakeProfit);

   if (Dig

Показано первые 50% кода (символов: 9189)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
918,90₽ ≈ $11.23