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

iplaton_fx5_divergence_1.0.mq4

Похожие материалы по тегам

#1.mtf_collider_h4_close_13_v18bar.mq4MQL4 / MetaTrader 4 · 1 общих теговea robofibo source v.11.2.mq4MQL4 / MetaTrader 4 · 1 общих теговsma crossover scalper ea for mt4.mq4MQL4 / MetaTrader 4 · 1 общих теговr15 pivot points expert advisor by @fundedmillionairess.mq4MQL4 / MetaTrader 4 · 1 общих теговnewstrader.mq5MQL5 / MetaTrader 5 · 1 общих теговmm3.0_flip_codepro_v3.1_with_cooldown@lifeindreamsworld.mq5MQL5 / MetaTrader 5 · 1 общих тегов
Вы автор или правообладатель?

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

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

О программе

Советник iPlaton FX5 Divergence ориентирован на торговлю по сигналам дивергенции на базе пользовательского индикатора FX5_Divergence_V2[1].1 в платформе MetaTrader 4. При обнаружении бычьей или медвежьей дивергенции он открывает соответствующие позиции и при необходимости закрывает противоположные ордера.

Продукт поддерживает сетную торговлю с ограничением максимального количества открытых ордеров, а также полный набор инструментов управления рисками: фиксированные уровни Take Profit и Stop Loss, перевод стопа в безубыток, Trailing Stop и оптимизацию лота по риску от депозита.

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

Внутренняя константа nameEA определена как EA_RSI_Divergence_1.0. Торговые комментарии формируются с использованием этого имени и магического номера для идентификации ордеров.

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

НастройкаОписание
s001 Разделитель настроек.
separator1 Разделитель блока настроек.
fastEMA Период быстрой скользящей средней.
slowEMA Период медленной скользящей средней.
signal Период сигнальной линии.
UseClose Управляет закрытием позиций при появлении нового сигнала: без закрытия, только противоположные или любые позиции.
TradeON Включает или отключает автоматическую торговлю советником.
Magic Магический номер для идентификации ордеров, управляемых советником.
Lots Стартовый лот для открытия ордеров.
MaxLot Максимально допустимый лот при оптимизации размера позиции.
LotsOptimized Включает оптимизацию размера лота на основе заданного риска в процентах от депозита.
Risk Максимальный риск при открытии ордера, выраженный в процентах от депозита.
MinMinutOpen Минимальный интервал в минутах между последовательными открытыми ордерами.
GridSize Максимальное количество одновременно открытых ордеров.
TakeProfit Тейк-профит по умолчанию, в пунктах.
StopLoss Стоп-лосс по умолчанию, в пунктах. Если значение равно 0, стоп-лосс не применяется.
UseBreakEvent Включает автоматический перевод стоп-лосса в безубыток.
BreakEventStopPips Расстояние стоп-лосса от текущей цены, в пунктах, при переводе стопа в безубыток.
BreakEventStartPips Расстояние стоп-лосса от цены открытия ордера, в пунктах, при переводе стопа в безубыток.
UseTrailing Включает или отключает Trailing Stop.
TrailingStopPips Расстояние Trailing Stop от текущей цены, в пунктах.
TrailingStartPips Расстояние от цены открытия ордера, при котором начинается работа Trailing Stop, в пунктах.
TrailingStepPips Шаг перемещения стоп-лосса при срабатывании Trailing Stop, в пунктах.
UseDayClose Ежедневное закрытие всех открытых ордеров пары к заданному часу.
HourCloseOrders Час (по времени брокера), после которого ежедневно закрываются все ордера пары.
TimeSourceToUse Источник времени для расчётов: местное время, время брокера или UTC.
tradingHours Периоды времени торговли в формате +ЧЧ.ММ,-ЧЧ.ММ. Если пусто, торговля разрешена круглосуточно.
debug Запись диагностических сообщений в журнал.
Show_OpenTrades Отображение на графике трасс открытых ордеров.
Show_ClosedTrades Отображение на графике трасс закрытых ордеров.
LookbackDays Количество дней истории закрытых ордеров, отображаемых на графике.
X_msgM Горизонтальная позиция текстового сообщения на экране.
Y_msgM Вертикальная позиция текстового сообщения на экране.
Получить полный код

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

#define   nameEA "EA_RSI_Divergence_1.0"
#property strict 
#include <stderror.mqh>
#include <stdlib.mqh>

enum YN 
{
  NO  = 0, //Нет
  YES = 1  //Да
};
enum ENUM_TIMESRC
{
   tLocal  = 0, //Время Местное
   tBROKER = 1, //Время Брокера  
   tGMT    = 2  //Время UTC по Гринвичу
};
enum CLOSING_MANAGEMENT
{
	None,			 //Не закрывать (без СЛ - опасно!)
	OnlyCounters,//Закрывать только противоположные
	All			 //Закрывать любые
};

extern string  •pips = "^^^ Внимание! Пункты 5-ти знака ставить как для 4-х знака";  //^^^ Внимание! Пункты 5-ти знака ставить как для 4-х знака
extern  string s001="================================================================";//================================================================

extern string  separator1 = "*** OSMA Settings ***";
extern int     fastEMA        = 12;     // Период быстрой MA
extern int     slowEMA        = 26;     // Период медленной МА
extern int     signal         = 9;      // Период сигнальной линии

extern string  •trade = "=== УПРАВЛЕНИЕ ТОРГОВЛЕЙ ==="; //=== УПРАВЛЕНИЕ ТОРГОВЛЕЙ ===
extern CLOSING_MANAGEMENT UseClose = OnlyCounters;//Управление закрытием позиций при новом сигнале
extern YN      TradeON        = YES;    // Автоматическая торговля ( ДА или НЕТ ).
extern int     Magic          = 200;    // Магик номер 
extern double  Lots           = 0.1;    // Стартовый лот      
extern double  MaxLot         = 100;    // Максимальный лот
extern YN      LotsOptimized  = YES;    // Оптимизировать лот ( ДА или НЕТ )
extern double  Risk           = 1.5;    // Максимальный риск при открытии ордера, в % от депозита
extern double  MinMinutOpen   = 0;      // Минимальное время между ордерами, в минутах
extern int     GridSize       = 10;     // Максимальное количество открытых ордеров

extern string  •tpsl = "^^^ Управление TP и SL ордеров";  //^^^ Управление TP и SL ордеров
extern int     TakeProfit     = 0;      // Take Profit (TP) по умолчанию, в пунктах
extern int     StopLoss       = 0;      // Stop Loss (SL) по умолчанию, в пунктах. Если=0, не применять
extern string  •be = "^^^ Перевод Stoploss ордеров в безубыток"; //^^^ Перевод Stoploss ордеров в безубыток
extern YN      UseBreakEvent       = YES; // Включить перевод Stoploss в безубыток ( ДА )
extern int     BreakEventStopPips  = 7;   // Расстояние Stoploss от текущей цены, в пунктах     
extern int     BreakEventStartPips = 1;   // Расстояние Stoploss от цены открытия ордера, в пунктах
extern string  •tr = "^^^ Модернизация ордеров Trailing stoploss"; //^^^ Модернизация ордеров Trailing stoploss
extern YN      UseTrailing       = YES;   // Включить Trailing  stoploss ( ДА )
extern int     TrailingStopPips  = 7;     // Расстояние Trailing stoploss от текущей цены, в пунктах     
extern int     TrailingStartPips = 4;     // Старт Trailing stoploss от цены открытия ордера, в пунктах
extern int     TrailingStepPips  = 1;     // Шаг срабатывания Trailing stoploss, в пунктах     

extern string  •closeday = "^^^ Ежедневно закрывать все ордера пары ^^^";  //^^^ Ежедневно закрывать все ордера пары ^^^
extern YN      UseDayClose      = NO;  // Ежедневно закрывать все ордера пары ( ДА или НЕТ )
extern int     HourCloseOrders  = 22;   // После какого часа закрывать ордера, по времени Брокера

extern string  •hours = "=== ЧАСЫ ТОРГОВЛИ СОВЕТНИКА ===";   //=== ЧАСЫ ТОРГОВЛИ СОВЕТНИКА ===
extern ENUM_TIMESRC  TimeSourceToUse = tBROKER; //Выберите тип времени 
extern string  •example = "^^^ +03.00,-10.30, +12.15,-15.00, +20.30,-23.45";  //ПРИМЕР, где: ' + ' начало ' - ' конец ' , 'запятая новый период
extern string  tradingHours  = "";   //Периоды времени торговли. Если пусто, то 24 часа 
string TradeComment = "";    //Комментарий для идентификации ордеров

extern string   •ord ="=== Визуализация ===";//=== Визуализация ===
extern  YN      debug  = NO;   // Запись сообщений в журнал ( ДА или НЕТ )
extern  YN      Show_OpenTrades    = NO;   // Показать на графике трассы открытых ордеров
extern  YN      Show_ClosedTrades  = NO;   // Показать на графике трассы закрытых ордерщв
extern int      LookbackDays       = 1;     // За сколько дней на графике показать трассы закрытых ордеров
extern int      X_msgM  = 10;   // Позиция X текста сообщения на экране
extern int      Y_msgM  = 10;   // Позиция Y текста сообщения на экране

color    Color_Trade_Long     = clrLime;
color    Color_Trade_Short    = clrRed;
color    Color_Dot_Center     = clrBlack;
color    Color_Dot_Closed     = clrDarkGray;
color    Color_Trade_Positive = clrAqua;
color    Color_Trade_Negative = clrRed;

double   priceUp, priceDn;
int      mdg=1;
datetime LatestTradeTime, LatestCloseTime;  
bool     CLOSE_PROFIT_DAY = false;
string   CLOSE_PROFIT_GvName;
int      tradeHours[];  //Массив временных интервалов в течении дня (когда разрешена торговля советником)
string   tradingHoursDisplay = "";
datetime OldCloseOrdersHistoryTotal=0;
double   sm = 25.2; 
string   symbol;
datetime RefreshTime=0;

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

void OnDeinit(const int reason)
{
   Comment("");
   DeleteAlert();
   deleteTick();    
   deleteInfo(); 
   deleteShowOpenTrade();
   deleteShowCloseTrade();

   return;

}//End void OnDeinit(const int reason)

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

bool CalculateSignal() 
{
	if(iCustom(_Symbol,0,"FX5_Divergence_V2[1].1","",fastEMA,slowEMA,signal,"",false,2,2) != EMPTY_VALUE)
   {
      if(UseClose != None) CloseTrades(OP_SELL);
      if(UseClose == All) CloseTrades(OP_BUY);
      openOrder(OP_BUY); 
		return(true);
   } else
	if(iCustom(_Symbol,0,"FX5_Divergence_V2[1].1","",fastEMA,slowEMA,signal,"",false,3,2) != EMPTY_VALUE)
   {
      if(UseClose != None) CloseTrades(OP_BUY);
      if(UseClose == All) CloseTrades(OP_SELL);
      openOrder(OP_SELL);
		return(true);
   }   

   return(false);

}//End void CalculateSignal()

void  CloseEveryDay()
{
   if(OrdersTotal()==0) return;

   MqlDateTime tm;
   TimeCurrent(tm); 
   int HCO = HourCloseOrders; //После какого часа закрывать ордера (от 1 до 23)
   if(HCO <= 0) HCO = 1;
   if(HCO > 23) HCO = 23;
   if(tm.hour != HCO) { CLOSE_PROFIT_DAY=false; return;} // сейчас не заданный час по текущему времени Брокера
   if(CLOSE_PROFIT_DAY==true) return; // да, ордера уже закрывались в заданном часе и поэтому ничего не надо делать.

   if(GlobalVariableCheck(CLOSE_PROFIT_GvName)==true)
   {

      datetime dt = (datetime)GlobalVariableGet(CLOSE_PROFIT_GvName);
      if(TimeYear(dt)==tm.year && TimeMonth(dt)==tm.mon && TimeDay(dt)==tm.day && TimeHour(dt)==HCO) 
            return; // да, ордера уже закрывались в заданном часе и поэтому ничего не надо делать.
      GlobalVariableDel(CLOSE_PROFIT_GvName);
   }

   double pl=0, pl_sum=0;
   int close_count=0;

   for(int cc = OrdersTotal() - 1; cc >= 0; cc--)
   {
      if(!OrderSelect(cc,SELECT_BY_POS,MODE_TRADES) ) continue;
      if(OrderSymbol() != Symbol()) continue;
      if(OrderMagicNumber() != Magic) continue;
      if(OrderCloseTime()>0) continue;
      pl = OrderProfit()+OrderSwap()+OrderCommission();

      bool result=CloseOrder(OrderTicket());
      if(result) 
      {
         close_count++;
         pl_sum+=pl;
      }   
   }//for(cc = OrdersTotal() - 1; cc >= 0; cc--)

   if(close_count>0) 
   {
      MqlDateTime tm1;
      TimeCurrent(tm1); 
      if(debug==YES) Print(TradeComment, ">>> По расписанию в " + IntegerToString(tm1.hour) + " чac. " + IntegerToString(tm1.min) + " мин. Закрыто ордеров ("+
                     IntegerToString(close_count)+") по суммарному профиту "+DoubleToString(pl_sum,2)+" <<<");
      CLOSE_PROFIT_DAY=true;
      GlobalVariableSet(CLOSE_PROFIT_GvName,(double)(TimeCurrent()));
   }

   return;

}//End void CloseEveryDay()

bool CloseOrder(int ticket)
{
   double ClosePrice, LOT;
   bool result=false;
   int digits;

   if(!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) return(false);
   if(OrderType() > 1) return(false);
   RefreshRates();
   digits = (int)SymbolInfoInteger(OrderSymbol(),SYMBOL_DIGITS);
   ClosePrice = NormalizeDouble(SymbolInfoDouble(OrderSymbol(),SYMBOL_BID),digits);
   if(OrderType()==OP_SELL)
         ClosePrice = NormalizeDouble(SymbolInfoDouble(OrderSymbol(),SYMBOL_ASK),digits);

   LOT=OrderLots();
   result=OrderClose(ticket,LOT,ClosePrice,5*mdg,clrBlue);
   if(result) return(true);

   return(false);

}//End bool CloseOrder(int ticket)

void CloseTrades(int type)
{
   if(OrdersTotal() == 0) return;
   int cc;
   double pl=0;

   for(cc=OrdersTotal()-1; cc>=0; cc--)
   {
      if(!OrderSelect(cc,SELECT_BY_POS,MODE_TRADES)) continue;
      if(OrderSymbol() != Symbol()) continue;
      if(OrderMagicNumber() != Magic) continue;
      if(OrderType()!=type) continue;
      if(OrderCloseTime()>0) continue;
      pl=OrderProfit()+OrderSwap()+OrderCommission();

      bool result=CloseOrder(OrderTicket());
      MqlDateTime tm1;
      TimeCurrent(tm1); 
      if(result) Print(TradeComment,">> ",symbol,": Закрыт при смене направления сигнала order №",IntegerToString(OrderTicket())," в "+
      IntegerToString(tm1.hour) + " чac. " + IntegerToString(tm1.min) + " мин. Profit = ",DoubleToStr(pl,2)," cash <<<-");

   }//for(cc=OrdersTotal()-1; cc>=0; cc--)

}//End void CloseTrades(int type)

double GetLots() 
{
   double Maxlot   = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   double Minlot   = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   double lotstep  = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);   // Минимальный шаг изменения объема для заключения сделки
   double LotSize  = MarketInfo(Symbol(),MODE_LOTSIZE);               // Размер контракта в базовой валюте инструмента
   double OneLot   = MarketInfo(Symbol(),MODE_MARGINREQUIRED);        // Размер свободных средств, необходимых для открытия 1 лота на покупку
   double Leverage = AccountLeverage();

   double lotsTmp = MathMin(Maxlot, MathMax(Minlot, Lots));   
   if(LotsOptimized==NO || Risk==0.0) return(lotsTmp);

   if(LotsOptimized==YES)
   {
      if(Risk==0) return(lotsTmp);
      if(Risk>100) Risk=100;       
      lotsTmp = MathFloor(AccountFreeMargin()*Risk/100/OneLot/lotstep)*lotstep;
      if(lotsTmp > MaxLot) lotsTmp = MaxLot;
      lotsTmp = MathMax(Minlot, MathMin(Maxlot, NormalizeDouble(lotsTmp / Minlot, 0) * Minlot));

      double needMoney = lotsTmp*OneLot; 
      if(needMoney > AccountFreeMargin())  // денег не достаточно на наш лот
      {
         Comment("Low Account Balance. Lots = ", lotsTmp, " , Free Margin = ", AccountFreeMargin());
         if(debug==YES) Print(TradeComment, " Low Account Balance. Lots = ", lotsTmp, " , Free Margin = ", AccountFreeMargin());
         lotsTmp = MathFloor(AccountFreeMargin()/OneLot/lotstep)*lotstep;
         lotsTmp = MathMax(Minlot, MathMin(Maxlot, NormalizeDouble(lotsTmp / Minlot, 0) * Minlot));
         return(lotsTmp);
      }   
      return(lotsTmp);
   }

   return(Lots);

}//End double GetLots() 

void openOrder(int type)
{  
   double sl, tp; 
   int i, try, ticket;
   bool rez=false;
   double minstop = MarketInfo(Symbol(),MODE_STOPLEVEL);
   int cnt = 0, LatestOrderType = 99;

   LatestCloseTime = 0;
   for(i=0; i<OrdersHistoryTotal(); i++)   
   {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
      if(OrderSymbol() != Symbol()) continue;
      if(OrderMagicNumber() != Magic) continue;
      if(OrderType()>1) continue;
      if(OrderCloseTime()==0) continue;

      if(OrderCloseTime() > LatestCloseTime)
         LatestCloseTime = OrderCloseTime(); // Дата время закрытия последнего ордера
   }

   LatestOrderType = type;
   LatestTradeTime = 0;
   for(i = OrdersTotal()-1; i>=0; i--)
   {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES) ) continue;
      if(OrderSymbol() != Symbol()) continue;
      if(OrderMagicNumber() != Magic) continue;
      if(OrderCloseTime()>0) continue;
      cnt++;

      if(OrderOpenTime() > LatestTradeTime)
      {
         LatestTradeTime = OrderOpenTime(); // Дата время открытия последнего ордера
         LatestOrderType = OrderType();     // Тип направления последнего ордера 
      }
   }

   if(TimeCurrent()-LatestCloseTime < MinMinutOpen*60 || 
      TimeCurrent()-LatestTradeTime < MinMinutOpen*60) return;   // MinMinutOpen -- Минимальное время между открытием ордеров в минутах 
   if(cnt >= GridSize || LatestOrderType != type) return;          
   RefreshRates(); 

   if(type == OP_SELL)
   {
      for(try = 1; try <= 3; try++)
      {          
         ticket=OrderSend(Symbol(),OP_SELL,GetLots(),Bid,10,0,0 ,"", Magic, 0, Red);
         if(ticket>0)
         {
            if(StopLoss > 0 || TakeProfit > 0)
            {
               if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
               {
                  while (!IsTradeAllowed()) Sleep(500);  
                  RefreshRates();
                  sl=0; if(StopLoss*mdg > minstop)   sl=NormalizeDouble(Ask + StopLoss*Point*mdg, Digits);
                  tp=0; if(TakeProfit*mdg > minstop) tp=NormalizeDouble(Bid - TakeProfit*Point*mdg, Digits);
                  rez=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0, Red); 
               }
            }
            return;
         }//if(ticket>0)
         else 
         {
            if(debug==YES) Print(TradeComment, "Ошибка ", ErrorDescription(GetLastError()),". Невозможно открыть ордер, попытка ", try);
            Sleep(1000);
            RefreshRates();
         }
      }//for(try = 1; try <= 2; try++)

      return;

   }//if(type == OP_SELL)

   if(type == OP_BUY)
   {  
      for(try = 1; try <= 3; try++)
      {                    
         ticket=OrderSend(Symbol(),OP_BUY,GetLots(),Ask,10,0,0, "", Magic, 0, Green);
         if(ticket>0)
         {
            if(StopLoss > 0 || TakeProfit > 0)
            {
               if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
               {
                  while (!IsTradeAllowed()) Sleep(500);  
                  RefreshRates();
                  sl=0; if(StopLoss*mdg > minstop)   sl=NormalizeDouble(Bid - StopLoss*Point*mdg, Digits);
                  tp=0; if(TakeProfit*mdg > minstop) tp=NormalizeDouble(Ask + TakeProfit*Point*mdg, Digits);
                  rez=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0, Green);
               }
            }
            return;
         }//if(ticket>0)
         else
         {
            if(debug==YES) Print(TradeComment, "Ошибка ", ErrorDescription(GetLastError()),". Невозможно открыть ордер, попытка ", try);
            Sleep(1000);
            RefreshRates();
         } 
      }//for(try = 1; try <= 2; try++)

      return;

   }//if(type == OP_BUY)

}//End void openOrder(int type)

void  OrdersSLModify()
{
   int    digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
   double ask =SymbolInfoDouble(symbol,SYMBOL_ASK);
   double bid =SymbolInfoDouble(symbol,SYMBOL_BID);
   double point =SymbolInfoDouble(symbol,SYMBOL_POINT);
   if(point==0) return;   
   double level = SymbolInfoInteger(symbol,SYMBOL_TRADE_STOPS_LEVEL) * point;
   double sl=0.0,price=0.0;
   double BreakEventStart = BreakEventStartPips*mdg*point;
   double BreakEventStop  = BreakEventStopPips*mdg*point;
   double TrailingStart = TrailingStartPips*mdg*point;
   double TrailingStop  = TrailingStopPips*mdg*point;
   double TrailingStep  = TrailingStepPips*mdg*point;

   for(int i=OrdersTotal()-1; i>=0; i--)
   {
      if(!OrderSelect(i,SELECT_BY_POS)) continue;
      if(OrderSymbol()!=symbol)  continue;
      if(OrderMagicNumber() != Magic) continue;
      if(OrderCloseTime()>0 || OrderType()>1) continue;

      sl    = OrderStopLoss();
      price = OrderOpenPrice();

      if(OrderType()==OP_BUY) 
      {
         if(UseBreakEvent==YES)
            if((sl==0 || sl<price) && bid-price > BreakEventStart+BreakEventStop)  sl=NormalizeDouble(price+BreakEventStart,digits);
         if(UseTrailing==YES)
         {
            if((sl==0 || sl<price) && bid-price > TrailingStart+TrailingStop)  sl=NormalizeDouble(price+TrailingStart,digits); //else
            if(sl>price && bid>= (NormalizeDouble(price+BreakEventStart - sl,digits) == 0 ? price + (TrailingStop + TrailingStart) :
					sl+(TrailingStop+TrailingStep))) sl=NormalizeDouble(bid-TrailingStop,digits);
         }
         if(sl==0 || (sl>0 && bid<sl+level)) sl=OrderStopLoss();
         if(!ZE(sl,OrderStopLoss(),point))
         {
            if(!OrderModify(OrderTicket(),price,sl,OrderTakeProfit(),0))
               if(debug==YES) Print(TradeComment, "Не получилось переставить стоп, ошибка  " ,GetLastError());
            return;
         }
      }//if(OrderType()==OP_BUY) 

      if(OrderType()==OP_SELL)
      {
         if(UseBreakEvent==YES)
            if((sl==0 || sl>price) && price-ask > BreakEventStart+BreakEventStop)  sl=NormalizeDouble(price-BreakEventStart,digits); 
         if(UseTrailing==YES)
         {
            if((sl==0 || sl>price) && price-ask > TrailingStart+TrailingStop)  sl=NormalizeDouble(price-TrailingStart,digits); else
            if(sl<price && ask<= (NormalizeDouble(price-BreakEventStart - sl,digits) == 0 ? price - (TrailingStop + TrailingStart) :
				   sl - (TrailingStop + TrailingStep))) sl=NormalizeDouble(ask+TrailingStop,digits);
         }   
         if(sl==0 || (sl>0 && ask>sl-level)) sl=OrderStopLoss();
         if(!ZE(sl,OrderStopLoss(),point))
         {
            if(!Ord

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

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

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

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

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

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

Стоимость полного кода
3 166,50₽ ≈ $38.70