Скачать MetaTrader 5

WINZ16 проблема с тралом на фьючерсах: РЕШЕНО

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vladislav Andruschenko
94231
Vladislav Andruschenko 2016.11.04 16:52 

Всем привет. Друзья, 

Есть реальный счет в Бразильской компании. Есть фьючерс  WINZ16 

открывается сделка, например BUY, но почему то не срабатывает трал,

ткните пальцем где копать и в каком месте изучать. 

 

код трала:

void SimpeTrailing(string symToWork2,double averageprice=-1,int type=-1)
  {
   ZeroMemory(request);
   ZeroMemory(result);
   int PosTotal=PositionsTotal();
   for(int i=PosTotal-1;i>=0;i--)
     {

      if((PositionSelectByTicket(PositionGetTicket(i))==true || (!PositionSelectByTicket(PositionGetTicket(i)) && PositionSelect(symToWork2))) && PositionGetSymbol(i)==symToWork2)
        {

         int trailing_level=TrailingStopa;
         stop_level=SymbolInfoInteger(PositionGetString(POSITION_SYMBOL),SYMBOL_TRADE_STOPS_LEVEL);
         if(trailing_level<(int)stop_level && trailing_level!=0) trailing_level=(int)stop_level;
         if((PositionGetString(POSITION_SYMBOL)!=symToWork2)) continue;


         order_open_price= PositionGetDouble(POSITION_PRICE_OPEN);
         if(averageprice!=-1)order_open_price=averageprice;
         order_type       = PositionGetInteger(POSITION_TYPE);
         request.order    = PositionGetInteger(POSITION_IDENTIFIER);

         if(order_type==POSITION_TYPE_BUY && (order_type==type || type==-1))
           {
            // Трейлинг стоп
            if((trailing_level==0))continue; // условие, при котором трейлинг стоп не работает
            double sl=PositionGetDouble(POSITION_SL);
            double profit=PositionGetDouble(POSITION_PROFIT);
            if(SymbolInfoDouble(symToWork2,SYMBOL_BID)-trailing_level*SymbolInfoDouble(symToWork2,SYMBOL_POINT)>order_open_price
               && (SymbolInfoDouble(symToWork2,SYMBOL_BID)-trailing_level*SymbolInfoDouble(symToWork2,SYMBOL_POINT)>sl || sl==0))
              {
               sl=SymbolInfoDouble(symToWork2,SYMBOL_BID)-trailing_level*SymbolInfoDouble(symToWork2,SYMBOL_POINT);
               request.sl=sl;
               ModifyOrders(PositionGetInteger(POSITION_IDENTIFIER),request.sl,request.tp,"SimpeTrailing");
              }
           }// end POSITION_TYPE_BUY    

         if(order_type==POSITION_TYPE_SELL && (order_type==type || type==-1))
           {

            //--- Трейлинг стоп
            if((trailing_level==0)) continue;
            double sl=PositionGetDouble(POSITION_SL);
            double profit=PositionGetDouble(POSITION_PROFIT);
            if(SymbolInfoDouble(symToWork2,SYMBOL_ASK)+trailing_level*SymbolInfoDouble(symToWork2,SYMBOL_POINT)<order_open_price
               && (SymbolInfoDouble(symToWork2,SYMBOL_ASK)+trailing_level*SymbolInfoDouble(symToWork2,SYMBOL_POINT)<sl || sl==0))
              {
               sl=SymbolInfoDouble(symToWork2,SYMBOL_ASK)+trailing_level*SymbolInfoDouble(symToWork2,SYMBOL_POINT);
               request.sl=sl;
               ModifyOrders(PositionGetInteger(POSITION_IDENTIFIER),request.sl,request.tp,"SimpeTrailing");
              }

           }// end POSITION_TYPE_SELL

        }// end if select                

     }// end for
  }


 

 

 проблема в том, что позиция есть, показывает PositionsTotal() = 1

но дальше не идет  , потому что тикет = 0 PositionGetTicket(i) = 0 

 

как быть?

 

 

 

вот тут много всяких цифр. ::

 

 

как обрабатывать трал здесь?  

 

 

 

 

 

проблема решена так:

вместо:

 

 

if(PositionSelectByTicket(PositionGetTicket(i))==true && PositionGetSymbol(i)==symToWork2)

я сделал:

     (PositionSelectByTicket(PositionGetTicket(i))==true || (!PositionSelectByTicket(PositionGetTicket(i)) && PositionSelect(symToWork2)))

 

  

Vladislav Andruschenko
94231
Vladislav Andruschenko 2016.11.04 16:55  

выбор тикета сделки есть, 

 2016.11.04 17:44:56.499 (WINZ16,M1) dt=21271002 did=18591721 pt=0

 

ulong dt = HistoryDealGetTicket(i);
long did = HistoryDealGetInteger(dt, DEAL_POSITION_ID);
ulong pt=PositionGetTicket(i);
long ID=PositionGetInteger(POSITION_IDENTIFIER);

Print("dt="+dt+" did="+did+" pt="+pt+" ID="+ID);

 


 

2016.11.04 17:54:54.447 (WINZ16,M1) dt=21271002 did=18591721 pt=0 ID=18591721


Vladislav Andruschenko
94231
Vladislav Andruschenko 2016.11.04 16:56  
прикол в том, что на тестере и на демо все работает ок, не могу понять причину, потому что не знаю этих нюансов, 
Vladislav Andruschenko
94231
Vladislav Andruschenko 2016.11.04 17:44  

проблема решена так:

вместо:

 

 

if(PositionSelectByTicket(PositionGetTicket(i))==true && PositionGetSymbol(i)==symToWork2)

я сделал:

      if((PositionSelect(symToWork2) || PositionSelectByTicket(PositionGetTicket(i))==true || PositionSelectByTicket(PositionGetInteger(POSITION_IDENTIFIER))==true) && PositionGetSymbol(i)==symToWork2)

 

 

трал заработал. Всем спасибо 

Vladislav Andruschenko
94231
Vladislav Andruschenko 2016.11.04 17:53  

также модификацию я сделал не по тикету и по идиентификатору позиций

PositionGetInteger(POSITION_IDENTIFIER)
Vladislav Andruschenko
94231
Vladislav Andruschenko 2016.11.04 18:10  

а лучше так:

(PositionSelectByTicket(PositionGetTicket(i))==true || (!PositionSelectByTicket(PositionGetTicket(i)) && PositionSelect(symb)))
т.е. если позиция не выбрана по тикету - тогда выбор по символу - чтоб работало и на хедже и на неттинговом счете
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий