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

anti-martingale by ma.mq4

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

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

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

О программе

Данный продукт представляет собой торговый советник для платформы MetaTrader 4, написанный на языке MQL4. Основная стратегия основана на пересечении двух скользящих средних (быстрой и медленной): при пересечении вверх открывается покупка, при пересечении вниз — продажа.

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

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

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

НастройкаОписание
InitalLotSize Начальный размер лота для открытия позиции. Может пересчитываться динамически при включённом режиме DynamicLotSize.
StopLoss Уровень стоп-лосса в пунктах для открытых позиций.
TrailingStopLoss Расстояние трейлинг-стопа в пунктах от текущей цены позиции.
TrailingMinProfit Минимальная прибыль в пунктах, при достижении которой активируется трейлинг-стоп.
AntiMartingaleStopLoss Уровень стоп-лосса в пунктах, используемый для расчёта дозакрытия позиций в режиме антимартингейла.
AntiMartingaleMinLotInc Минимальный инкремент лота для дозакрытия позиции в режиме антимартингейла.
TakeProfit Уровень тейк-профита в пунктах для открытых позиций.
EquityRiskPercentage Процент собственного капитала, рискуемый на одну позицию, используемый при динамическом расчёте размера лота.
Slippage Допустимое отклонение цены исполнения ордера от запрашиваемой цены в пунктах.
MagicNumber Уникальный идентификатор (магическое число) для идентификации ордеров, открытых данным советником.
FastMAPeriod Период быстрой скользящей средней, используемой для формирования торговых сигналов.
SlowMAPeriod Период медленной скользящей средней, используемой для формирования торговых сигналов.
useAntiMartingale Переключатель: при включении советник рассчитывает и открывает дозакрытие позиций при убытках по имеющейся позиции.
CheckOncePerBar Переключатель: при включении торговой алгоритм запускается только при появлении нового ценового бара, что снижает количество повторных сигналов внутри бара.
useTimer Переключатель: при включении торговля разрешена только в заданном временном диапазоне между AllowedTradeStartTime и AllowedTradeEndTime.
useLocalTimeInTimer Переключатель: при включении для проверки торгового времени используется локальное время сервера, иначе — текущее серверное время.
AllowedTradeStartTime Начальное время разрешённой торговли в формате даты и времени. Используется совместно с AllowedTradeEndTime для ограничения временного окна открытия сделок.
AllowedTradeEndTime Конечное время разрешённой торговли в формате даты и времени. Используется совместно с AllowedTradeStartTime для ограничения временного окна открытия сделок.
DynamicLotSize Переключатель: при включении размер лота рассчитывается автоматически на основе процента риска от собственного капитала, а не фиксированного начального значения.
Получить полный код

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

???//+------------------------------------------------------------------+

#include <IncludeExample.mqh>
#include <stdlib.mqh>

#property version   "1.00"
#property strict

extern double InitalLotSize=0.5;
extern double StopLoss=50;
extern double TrailingStopLoss=50;
extern double TrailingMinProfit=-100;
extern double AntiMartingaleStopLoss=50;
extern double AntiMartingaleMinLotInc=0.1;
extern double TakeProfit=100;
extern double EquityRiskPercentage=4;

extern int Slippage=5;
extern int MagicNumber=123;

extern int FastMAPeriod = 10;
extern int SlowMAPeriod = 20;

extern bool useAntiMartingale=true;
extern bool CheckOncePerBar=true;
extern bool useTimer=false;
extern bool useLocalTimeInTimer=false;
extern string AllowedTradeStartTime="1970.1.1.0.0";
extern string AllowedTradeEndTime="2099.12.31.23.59";

int BuyTicket;
int SellTicket;
double UsePoint;
int UseSlippage;
datetime currentTimeStamp;

input bool     DynamicLotSize=true;

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

void OnDeinit(const int reason)
  {

  }

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

   double BuyStopLoss=0;
   double BuyTakeProfit=0;

   double OpenPrice=0;
   double SellStopLoss=0;
   double SellTakeProfit=0;
   bool newBar=false;
   int barShift=0;
   bool isTradeAllowed=false;
   datetime currentTime=TimeLocal();

   datetime tradeStartTime=StrToTime(AllowedTradeStartTime);
   datetime tradeEndTime=StrToTime(AllowedTradeEndTime);

   if(useLocalTimeInTimer)
      currentTime=TimeLocal();
   else
      currentTime=TimeCurrent();

   if(useTimer)
     {
      if(currentTime<=tradeEndTime && currentTime>=tradeStartTime)
        {
         isTradeAllowed=true;
        }
      else
        {
         isTradeAllowed=false;
        }
     }
   else
      isTradeAllowed=true;

   if(CheckOncePerBar)
     {
      barShift=1;
      if(currentTimeStamp==Time[0])
        {

         newBar=false;
        }
      else
        {

         Alert("OnTick(): New time bar is drawn, should trigger trading algorithm.");
         currentTimeStamp=Time[0]; //Adjust currentTimeStamp to open time of latest K bar.
         newBar=true;
        }
     }

   if(newBar && isTradeAllowed) // Check trade condition is allowed to run
     {

      Alert("OnTick(): Trade condition true, trade decision started at ",currentTimeStamp);

      if(FastMAPeriod>=SlowMAPeriod)
        {

         string ErrLog;

         Alert("OnTick(): FastMAPeriod is longer than SlowMAPeriod, EA should not proceed.");
         ErrLog=StringConcatenate("OnTick(): FastMAPeriod is longer than SlowMAPeriod, EA should not proceed.");
         Print(ErrLog);
         return;
        }

      double FastMA = iMA(NULL,0, FastMAPeriod,0,MODE_SMA,PRICE_CLOSE,barShift);
      double SlowMA = iMA(NULL,0, SlowMAPeriod,0,MODE_SMA,PRICE_CLOSE,barShift);

      Alert("OnTick(): FastMA=",FastMA,",SlowMA=",SlowMA,", BuyTicket=",BuyTicket,",SellTicket=",SellTicket);

      if(FastMA>=SlowMA)
        {
         Alert("OnTick(): Buy action: FastMA=",FastMA,",SlowMA=",SlowMA,", BuyTicket=",BuyTicket,",SellTicket=",SellTicket);

         CloseAllSellOrders(Symbol(),MagicNumber,UseSlippage);
         Alert("OnTick(): SellMarketCount() now returns ",SellMarketCount(Symbol(),MagicNumber));
         if(SellMarketCount(Symbol(),MagicNumber)==0)
           {
            SellTicket=0;
            Alert("OnTick(): reset SellTicket to ",SellTicket);
           }

         CloseAllSellStopOrders(Symbol(),MagicNumber);
         Alert("OnTick(): SellStopCount() now returns ",SellStopCount(Symbol(),MagicNumber));
         CloseAllSellLimitOrders(Symbol(),MagicNumber);
         Alert("OnTick(): SellLimitCount() now returns ",SellLimitCount(Symbol(),MagicNumber));

         OpenPrice=Ask;
         int marketOrderCnt=BuyMarketCount(Symbol(),MagicNumber);
         if(marketOrderCnt==0)
           {

            InitalLotSize=CalcLotSize(DynamicLotSize,EquityRiskPercentage,StopLoss,InitalLotSize);
            InitalLotSize=VerifyLotSize(InitalLotSize);
            Alert("OnTick(): DynamicLotSize=",DynamicLotSize,", InitalLotSize=",InitalLotSize);

            if(StopLoss>0)
              {
               BuyStopLoss=CalcBuyStopLoss(Symbol(),StopLoss,OpenPrice);
               BuyStopLoss=AdjustBelowStopLevel(Symbol(),BuyStopLoss);
              }
            if(TakeProfit>0)
              {
               BuyTakeProfit=CalcBuyTakeProfit(Symbol(),TakeProfit,OpenPrice);
               BuyTakeProfit=AdjustAboveStopLevel(Symbol(),BuyTakeProfit);
              }
            BuyTicket=OpenBuyOrder(Symbol(),InitalLotSize,UseSlippage,MagicNumber);
            AddStopProfit(BuyTicket,BuyStopLoss,BuyTakeProfit);
            Alert("OnTick(): BuyTicket=",BuyTicket,", TP=",BuyTakeProfit,", SL=",BuyStopLoss);

            if(BuyTicket==-1)
              {

               Alert("OnTick(): Problem to open buy order, BuyTicket=",BuyTicket);
               BuyTicket=0;
               Alert("OnTick(): Problem to open buy order, now BuyTicket reset to ",BuyTicket);
              }
           }
         else if(marketOrderCnt>0 && useAntiMartingale)
           {

            double newLotShouldAdd=CalcMartingaleLotSize(MagicNumber,AntiMartingaleStopLoss,AntiMartingaleMinLotInc);
            bool selected=OrderSelect(BuyTicket,SELECT_BY_TICKET);
            if(selected==false)
              {
               int ErrorCode=GetLastError();
               string ErrDesc=ErrorDescription(ErrorCode);

               string ErrAlert=StringConcatenate(Symbol(),"OnTick(): Select First Buy Order - Error: ",Err

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

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

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

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

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

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

Стоимость полного кода
833,80₽ ≈ $10.19