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

grid trial ea.mq4

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

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

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

О программе

Данный продукт представляет собой торгового советника для платформы MetaTrader 4, реализующего стратегию сеточной торговли. Советник размещает отложенные ордера BUY STOP и SELL STOP на заданных уровнях сетки вокруг начальной цены, формируя сетку из позиций вверх и вниз от точки входа.

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

Встроена система управления денежными средствами, позволяющая автоматически рассчитывать размер лота на основе баланса счёта, плеча и заданного коэффициента риска. Советник отслеживает историю ордеров для определения завершения торговой сессии и может продолжать работу или останавливаться в зависимости от соответствующей настройки.

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

НастройкаОписание
INCREMENT Расстояние между уровнями сетки, измеряемое в пунктах. Определяет шаг размещения отложенных ордеров BUY STOP и SELL STOP от начальной цены.
LOTS Размер лота для открытия каждого отложенного ордера. Используется как базовый объём позиции при отсутствии включённого управления денежными средствами.
LEVELS Количество уровней сетки. Задаёт число отложенных ордеров, размещаемых в каждом направлении от начальной цены.
MAX_LOTS Максимальный допустимый размер лота при частичном закрытии позиции. Ограничивает объём закрываемой части ордера при достижении целевых уровней прибыли.
MAGIC Магический номер, используемый для идентификации ордеров, открытых данным советником, среди всех ордеров на счёте.
CONTINUE Переключатель продолжения работы советника после завершения торговой сессии. При значении true советник продолжает торговлю после обнаружения завершённых ордеров в истории, при false — останавливается.
MONEY_MANAGEMENT Переключатель системы автоматического управления денежными средствами. При включении размер лота рассчитывается на основе баланса счёта, плеча и коэффициента риска.
RISK_RATIO Коэффициент риска, используемый при расчёте размера лота в режиме управления денежными средствами. Определяет долю баланса, подвергаемую риску.
Получить полный код

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

extern int       INCREMENT=35;
extern double    LOTS=0.01;
extern int       LEVELS=1;
extern double    MAX_LOTS=99;
extern int       MAGIC=1803;
extern bool      CONTINUE=true;
extern bool      MONEY_MANAGEMENT=false;
extern int       RISK_RATIO=2;

bool             UseProfitTarget=false;
bool             UsePartialProfitTarget=false;
int              Target_Increment = 50;
int              First_Target = 20;
bool             UseEntryTime=false;
int              EntryTime=0;

bool Enter=true;
int nextTP;

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

int deinit() {
   return(0);
}

int start() {
      // код доступен только после оплаты
   }
   int ticket, cpt, profit, total=0, BuyGoalProfit, SellGoalProfit, PipsLot=0;
   double ProfitTarget=INCREMENT*2; //Consider making this a parameter
   double BuyGoal=0, SellGoal=0;
   double spread=(Ask-Bid)/Point;
   double InitialPrice=0;

   if(INCREMENT<MarketInfo(Symbol(),MODE_STOPLEVEL)+spread)
      INCREMENT=1+MarketInfo(Symbol(),MODE_STOPLEVEL)+spread;

   if(MONEY_MANAGEMENT)
      LOTS=NormalizeDouble(AccountBalance()*AccountLeverage()/1000000*RISK_RATIO,0)*MarketInfo(Symbol(),MODE_MINLOT);

   if(LOTS<MarketInfo(Symbol(),MODE_MINLOT)) {
      Comment("Not Enough Free Margin to begin");
      return(0);
   }

   for(cpt=1;cpt<LEVELS;cpt++) PipsLot+=cpt*INCREMENT;

   for(cpt=0;cpt<OrdersTotal();cpt++) {
      OrderSelect(cpt,SELECT_BY_POS,MODE_TRADES);
      if(OrderMagicNumber()==MAGIC && OrderSymbol()==Symbol()) {
         total++;
         if(!InitialPrice) InitialPrice=StrToDouble(OrderComment());
         if(UsePartialProfitTarget && UseProfitTarget && OrderType()<2) {
            double val=getPipValue(OrderOpenPrice(),OrderType());
            takeProfit(val,OrderTicket());
         }
      }
   }

   if(total<1 && Enter && (!UseEntryTime || (UseEntryTime && Hour()==EntryTime))) {
      if(AccountFreeMargin()<(100*LOTS)) { //Consider making 100 a parameter
         Print("Not enough free margin to begin");
         return(0);
      }

      InitialPrice=Ask;
      SellGoal=InitialPrice-(LEVELS+1)*INCREMENT*Point;
      BuyGoal=InitialPrice+(LEVELS+1)*INCREMENT*Point;

      for(cpt=1;cpt<=LEVELS;cpt++) {
         double buyEntry = InitialPrice + cpt * INCREMENT * Point;
         double sellEntry = InitialPrice - cpt * INCREMENT * Point;

         double buySL, buyTP, sellSL, sellTP;
         GetSLTP(buyEntry, OP_BUYSTOP, INCREMENT, buySL, buyTP);
         GetSLTP(sellEntry, OP_SELLSTOP, INCREMENT, sellSL, sellTP);

         OrderSend(Symbol(), OP_BUYSTOP, LOTS, buyEntry, 2, buySL, buyTP, DoubleToStr(InitialPrice,Digits), MAGIC, 0);
         OrderSend(Symbol(), OP_SELLSTOP, LOTS, sellEntry, 2, sellSL, sellTP, DoubleToStr(InitialPrice,Digits), MAGIC, 0);
      }
   }
   else {
      BuyGoal=InitialPrice+INCREMENT*(LEVELS+1)*Point;
      SellGoal=InitialPrice-INCREMENT*(LEVELS+1)*Point;

      int totalHistory = OrdersHistoryTotal();
      for(cpt=0;cpt<totalHistory;cpt++) {
         OrderSelect(cpt,SELECT_BY_POS,MODE_HISTORY);
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC &&  StrToDouble(OrderComment())==InitialPrice) {
            EndSession();
            return(0);
         }
      }

      if(UseProfitTarget && CheckProfits(LOTS,OP_SELL,true,InitialPrice)>ProfitTarget) {
         deleteAllPendingOrders();
         return(0);
      }

      BuyGoalProfit=CheckProfits(LOTS,OP_BUY,false,InitialPrice);
      SellGoalProfit=CheckProfits(LOTS,OP_SELL,false,InitialPrice);

      for(cpt=LEVELS;cpt>=1 && BuyGoalProfit<ProfitTarget;cpt--) {
         double buyEntry2 = InitialPrice + cpt * INCREMENT * Point;
         if(Ask <= (buyEntry2 - MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)) {
            double sl2, tp2;
            GetSLTP(buyEntry2, OP_BUYSTOP, INCREMENT, sl2, tp2);
            ticket = OrderSend(Symbol(), OP_BUYSTOP, cpt*LOTS, buyEntry2, 2, sl2, tp2, DoubleToStr(InitialPrice,Digits), MAGIC, 0);
            if(ticket>0)
               BuyGoalProfit += LOTS * (tp2 - buyEntry2) / Point;
         }
      }

      for(cpt=LEVELS;cpt>=1 && SellGoalProfit<ProfitTarget;cpt--) {
         double sellEntry2 = InitialPrice - cpt * INCREMENT * Point;
         if(Bid >= (sellEntry2 + MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)) {

            GetSLTP(sellEntry2, OP_SELLSTOP, INC

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

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

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

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

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

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

Стоимость полного кода
640₽ ≈ $7.82