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

LSMA_Daily_EA

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

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

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

О программе

LSMA_Daily_EA — торговый советник для MetaTrader 4, работающий на дневных временных рамках. Советник анализирует направление тренда и открывает сделки на покупку или продажу при смене направления сигнальных линий. Позиции закрываются при изменении соотношения между быстрой и медленной линиями в обратном направлении.

Работа советника ограничена определённым периодом в течение года. Одновременно может быть открыта только одна позиция по одному символу. Советник поддерживает как ручное управление размером лота, так и автоматический расчёт с учётом процента риска от средств счёта.

Доступны настройки для различных типов брокерских счетов: стандартный, мини и микро. Советник учитывает ограничения брокера на дробные лоты и минимальный размер позиции. Также предусмотрены контроль убытков и фиксация прибыли через стоп-лосс и тейк-профит, а также настройка допустимого проскальзывания при исполнении ордеров.

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

НастройкаОписание
Expert_Name Имя советника — Имя, используемое в комментариях к ордерам и в заголовке настройки.
MagicNumberBase Базовый магический номер — Базовое значение, используемое для формирования уникального идентификатора ордеров.
mm Группа управления денежными средствами — Разделитель группы настроек управления денежными средствами.
Lots Размер лота — Базовый размер лота для сделки при ручном управлении.
Change to false to shutdown money management controls. (UseMoneyManagement) Использовать управление денежными средствами — Включает или отключает автоматический расчёт размера лота.
Change to whatever percent of equity you wish to risk. (TradeSizePercent) Процент риска — Процент от средств счёта, используемый для расчёта размера лота при управлении рисками.
BrokerPermitsFractionalLots Брокер разрешает дробные лоты — Указывает, разрешает ли брокер дробные значения лота.
m1 Настройка типа счёта — Подсказка для настройки учёта типа торгового счёта.
BrokerIsIBFX Брокер IBFX — Флаг, указывающий, что брокер является IBFX, что активирует соответствующую логику расчёта лота.
BrokerIsCrownForex Брокер CrownForex — Флаг, указывающий, что брокер является CrownForex, что активирует соответствующую логику расчёта лота.
fm Группа расчёта лота — Подсказка для выбора базы расчёта размера лота.
UseFreeMargin Использовать свободный маржинал — При включении размер лота рассчитывается на основе свободного маржи, при выключении — на основе баланса счёта.
st6 Группа контроля прибыли — Разделитель группы настроек контроля прибыли и убытков.
StopLoss Стоп-лосс — Фиксированный размер стоп-лосса в пунктах; ноль отключает стоп-лосс.
TakeProfit Тейк-профит — Фиксированный размер тейк-профита в пунктах; ноль отключает тейк-профит.
Slippage Проскальзывание — Максимально допустимое проскальзывание при открытии и закрытии ордеров в пунктах.
Получить полный код

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

#include <stdlib.mqh>
#include <stderror.mqh> 

extern string  Expert_Name    = "LSMA_Daily";
extern int     MagicNumberBase = 200000;
 string  UserComment = "LSMA_EA";
 string  in="---Indicator settings---";
 int     LSMAShortPeriod=7;
 int     LSMALongPeriod=16;
 int     MonthStart = 9;
 int     MonthEnd = 11;
 bool    UseFreshCross = true;

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

extern string  st6 = "--Profit Controls--";
extern double  StopLoss=0;
extern double  TakeProfit=0;
extern int     Slippage=3;

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

bool     YesStop;
double   myPoint;
int      totalTries = 5; 
int      retryDelay = 1000;
int      myTradeErr;

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

int deinit()
{
 return(0);
}

double LSMADaily(int Rperiod, int shift)
{
   int i;
   double sum;
   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;
       tmp = ( i - lengthvar)*iClose(NULL,1440,length-i+shift);
       sum+=tmp;
      }
      wt = sum*6/(length*(length+1));

    return(wt);
}

bool CheckExitCondition(int TradeType)
{
   bool YesClose;
   double L_Fast,L_Slow;

   YesClose = false;
   L_Fast=LSMADaily(LSMAShortPeriod,1);
   L_Slow=LSMADaily(LSMALongPeriod,1);

   if (TradeType == OP_BUY)
   {
      if (L_Fast < L_Slow) YesClose = true;
   }
   if (TradeType == OP_SELL)
   {
    if (L_Fast > L_Slow) YesClose = true;
   }

   return (YesClose);
}

bool CheckEntryCondition(int TradeType)
{
   bool YesTrade;
   double L_Fast,L_Slow;
   double L_FastPrev,L_SlowPrev;

   L_Fast=LSMADaily(LSMAShortPeriod,1);
   L_Slow=LSMADaily(LSMALongPeriod,1);

   YesTrade = false;

   if (TradeType == OP_BUY)
   {
    if ( L_Fast > L_Slow)
    {
       if (UseFreshCross == true)
       {
         L_FastPrev=LSMADaily(LSMAShortPeriod,2);
         L_SlowPrev=LSMADaily(LSMALongPeriod,2);
         if (L_FastPrev < L_SlowPrev) YesTrade = true; else YesTrade = false;
       }
       else
         YesTrade = true;
     }
   }

   if (TradeType == OP_SELL)
   {
     if ( L_Fast < L_Slow)
     {
       if (UseFreshCross == true)
       {
         L_FastPrev=LSMADaily(LSMAShortPeriod,2);
         L_SlowPrev=LSMADaily(LSMALongPeriod,2);
         if (L_FastPrev > L_SlowPrev) YesTrade = true; else YesTrade = false;
       }
       else
         YesTrade = true;
     }
   }

   return (YesTrade);
}

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

double GetLots()
{
   double lot;
   double myMaxLot = MarketInfo(Symbol(), MODE_MAXLOT);

   if(UseMoneyManagement == false) return(Lots);

   if (BrokerIsIBFX == true)
   {
     lot = Calc_Money_Management();
     return(lot);
   }

   if (BrokerIsCrownForex == true)
   {
     lot = Calc_CrownMoney_Management();
     return(lot);
   }

   lot = LotsOptimized();

   if (AccountIsMicro == true)
   {
      lot = MathFloor(lot*100)/100;
      if (lot < 0.01) lot = 0.01;
      if (lot > myMaxLot) lot = myMaxLot;
      return(lot);
   }

   if(AccountIsMini == true)
   {
      lot = MathFloor(lot*10)/10;
      if (lot < 0.1) lot = 0.1;
      if (lot > myMaxLot) lot = myMaxLot;
      return(lot);
   }

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

   if (lot < 1.0) lot = 1.0;
   if (lot > myMaxLot) lot = myMaxLot;

   return(lot);
}

double LotsOptimized()
  {
   double lot=Lots;

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

   return(lot);
} 

double Calc_CrownMoney_Management()
{
   double lot;

   lot=NormalizeDouble((AccountEquity()*TradeSizePercent/10000)/10,1);

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

      return(lot);
   }

   lot = lot * 100000;
   if (lot < 100000) lot = 100000;

   return(lot);
}

double Calc_Money_Management()
{

   double         MM_MinLotSize=0;
   double         MM_MaxLotSize=0;
   double         MM_LotStep=0;
   double         MM_Decimals=0;
   int            MM_AcctLeverage=0;
   int            MM_CurrencyLotSize=0;

   double OrderLotSize;

   MM_AcctLeverage = AccountLeverage();
   MM_MinLotSize = MarketInfo(Symbol(),MODE_MINLOT);
   MM_MaxLotSize = MarketInfo(Symbol(),MODE_MAXLOT);
   MM_LotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
   MM_CurrencyLotSize = MarketInfo(Symbol(),MODE_LOTSIZE);

   if(MM_LotStep == 0.01) {MM_Decimals = 2;}
   if(MM_LotStep == 0.1) {MM_Decimals = 1;}

   OrderLotSize = AccountEquity() * (TradeSizePercent * 0.01) / (MM_CurrencyLotSize / MM_AcctLeverage);
   if(BrokerPermitsFractionalLots == true)
        OrderLotSize = StrToDouble(DoubleToStr(OrderLotSize, MM_Decimals));
   else
        OrderLotSize = MathRound(OrderLotSize);

   if (OrderLotSize < MM_MinLotSize) {OrderLotSize = MM_MinLotSize;}
   if (OrderLotSize > MM_MaxLotSize) {OrderLotSize = MM_MaxLotSize;}

   return(OrderLotSize); 
}

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;
   double TPprice, STprice;

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

   if (Digits > 0) 
   {
     myPrice = NormalizeDouble( Ask, Digits);
     myStopLoss = NormalizeDouble( myStopLoss, Digits);
     myTakeProfit = NormalizeDouble( myTakeProfit, Digits); 
   }
   ticket=myOrderSend(Symbol(),OP_BUY,mLots,myPrice,mSlippage,0,0,mComment,mMagic,0,mColor); 
   if (ticket > 0)
   {
    if (OrderSelect( ticket,SELECT_BY_TICKET, MODE_TRADES) ) 
     {
      Print("BUY order opened : ", OrderOpenPrice( ));
         if (myStopLoss != 0 || myTakeProfit != 0)
	      {
            TPprice = 0;
            if (myTakeProfit > 0) TPprice=TakeLong(OrderOpenPrice(), myTakeProfit, myPoint);
            STprice = 0;
            if (myStopLoss > 0)
            {
              STprice = StopLong(OrderOpenPrice(), myStopLoss, myPoint);
		        STprice = ValidStopLoss(Symbol(), OP_BUY,Bid, STprice, myPoint);
		      }   

            if (Digits > 0) 
            {
              STprice = NormalizeDouble( STprice, Digits);
              TPprice = NormalizeDouble( TPprice, Digits); 
            }
		      ModifyOrder(ticket, OrderOpenPrice(), STprice, TPprice, LightGreen);
		   }
     }
   }
   else
   {
      err = GetLastError();
      if(err==0)
      { 
         return(ticket);
      }
      else
      {
           Print("Error opening BUY order [" + setup + "]: (" + err + ") " + ErrorDescription(err)); 
      }
   }

   return(ticket);
}

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

   RefreshRates();

   myStopLoss = StopShort(Ask,mStopLoss, myPoint);
   myTakeProfit = TakeShort(Ask,mTakeProfit, myPoint);

   if (Digits > 0) 
   {
     myPrice = NormalizeDouble( Bid, Digits);
     myStopLoss = NormalizeDouble( myStopLoss, Digits);
     myTakeProfit = NormalizeDouble( myTakeProfit, Digits); 
   }
   ticket=myOrderSend(Symbol(),OP_SELL,mLots,myPrice,mSlippage,0,0,mComment,mMagic,0,mColor); 
   if (ticket > 0)
   {
     if (OrderSelect( ticket,SELECT_BY_TICKET, MODE_TRADES) ) 
     {
      Print("Sell order opened : ", OrderOpenPrice());
         if (myStopLoss != 0 || myTakeProfit != 0)
	      {
            TPprice = 0;
          

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

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

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

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

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

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

Стоимость полного кода
1 345,70₽ ≈ $16.45