Скрипт для установки TP&SL в MetaTrader 5

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Gidol
22
Gidol  

Здравствуйте!

Помогите в поиске  скрипта  для установки  указанного в цене   Стоп Лосса и Тейк Профита на  всех открытых ордерах типа  buy или sell, по  валютной паре в активном графике.

Konstantin Nikitin
8626
Konstantin Nikitin  
Если ни чего не упустил, вроде так
#property strict

#include <Trade/Trade.mqh>
CTrade trade;

input int Deviation = 5,
          SL        = 0,
          TP        = 0;
//+------------------------------------------------------------------+
void OnStart()
{
     if( SL <= 0 && TP <= 0 ) return;
     
     trade.SetMarginMode();
     trade.SetDeviationInPoints(Deviation);
     trade.LogLevel(LOG_LEVEL_ERRORS);
     trade.SetTypeFillingBySymbol(_Symbol);
   
     int stopLevel = (int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL)+1,
         digits    = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS);
     double    sl = SL>0 ? ((SL<stopLevel ? stopLevel : SL)*_Point) : 0,
               tp = TP>0 ? ((TP<stopLevel ? stopLevel : TP)*_Point) : 0,
               bid = SymbolInfoDouble(_Symbol, SYMBOL_BID),
               ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

     for(int cnt=0; cnt<PositionsTotal(); cnt++)
     {
          string symbol = PositionGetSymbol(cnt);
          if( symbol != _Symbol ) continue;
          trade.SetExpertMagicNumber( PositionGetInteger(POSITION_MAGIC) );
          ulong ticket = PositionGetInteger(POSITION_TICKET);
     
          switch( (int)PositionGetInteger(POSITION_TYPE) )
          {
               case ORDER_TYPE_BUY:
                    if( PositionGetDouble(POSITION_SL) == NormalizeDouble(bid - sl, digits) && PositionGetDouble(POSITION_TP) == NormalizeDouble(bid + tp, digits) ) break;
                    if( trade.PositionModify( ticket,
                                              (sl>0 ? NormalizeDouble(bid - sl, digits) : PositionGetDouble(POSITION_SL)),
                                              (sl>0 ? NormalizeDouble(bid + tp, digits) : PositionGetDouble(POSITION_TP)) )
                      ) printf("Long position %s by %f to be modified", symbol, ticket);
                    break;
               case ORDER_TYPE_SELL:
                    if( PositionGetDouble(POSITION_SL) == NormalizeDouble(ask + sl, digits) && PositionGetDouble(POSITION_TP) == NormalizeDouble(ask - tp, digits) ) break;
                    if( trade.PositionModify( ticket,
                                              (sl>0 ? NormalizeDouble(ask + sl, digits) : PositionGetDouble(POSITION_SL)),
                                              (tp>0 ? NormalizeDouble(ask - tp, digits) : PositionGetDouble(POSITION_TP)) )
                      ) printf("Long position %s by %f to be modified", symbol, ticket);
                    break;
          }
     }
}
Gidol
22
Gidol  
Konstantin Nikitin:
Если ни чего не упустил, вроде так

Спасибо!  после открытия рынка протестирую.

Gidol
22
Gidol  

Konstantin

Скрипт  выставляет  TP и SL  только в том  случае, если их размер указывать  в пунктах. Можете, пожалуйста, подправить ваш  код  так,   чтобы  параметры для установки  уровней TP&SL задавались значениями  цены валютной пары?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий