FORTI. Problemi di applicazione - pagina 58

 
Andrey Khatimlianskii:
Esatto, la latenza di rete. E l'ordine impiega molto tempo per essere inviato (o ricevere la conferma) e l'evento viene perso.

No, non lo è!

1. questo non è un ritardo della "rete", ma un ritardo del server MT5(forse l'hardware del broker)

2. TradeTransaction NON è sempre perso (SEMPRE), come visto sopra, il ritardo era di 409 ms e l'evento non è stato perso

Ecco perché sostengo che non è la rete ma il server MT5 (l'hardware del broker) ad essere responsabile dei ritardi.

Il tempo di risposta del server della funzione CheckOrders() è da 700 a 1200 ms (a seconda di

in quale punto del timer (periodo 500 ms) il comando è stato inviato), che è 100 volte più lungo del tempo di esecuzione (nella mia configurazione) in modalità normale ( 7-9 ms)

Il fatto che con un ritardo di 18 ms l'evento è stato perso, e con 409 ms no, ci permette di dire che questo è un "bug" del server MT5 e non altri

cause.

Inoltre... Il mio amico, che vive in casa mia, scambia su due terminali con il mio robot attraverso il mio ISP tramite lo stesso router in casa, e per qualche motivo lui

nessuna latenza in quel momento!

2015.10.22 14:14:05.041 Trades 'xxxxx': modify order #22486145 buy limit 2.00 ED-6.16 at 1.1326 sl: 0.0000 tp: 0.0000 -> 1.1332, sl: 0.0000 tp: 0.0000
2015.10.22 14:14:05.049 Trades 'xxxxx': modify order #22486145 buy limit 2.00 ED-6.16 at 1.1326 sl: 0.0000 tp: 0.0000 -> 1.1332, sl: 0.0000 tp: 0.0000 placed for execution in 8 ms
2015.10.22 14:14:38.389 Trades 'xxxxx': cancel order #22486314 sell limit 2.00 Eu-12.16 at 82867
2015.10.22 14:14:38.397 Trades 'xxxxx': cancel order #22486314 sell limit 2.00 Eu-12.16 at 82867 placed for execution in 8 ms
 
Michael, per favore non modificare i post. Meglio aggiungerne di nuovi per non dover cercare gli aggiornamenti con gli occhi.
 
Andrey Khatimlianskii:
Michael, per favore non modificare i post. Meglio aggiungerne di nuovi, così non dovrai cercare gli aggiornamenti con gli occhi.
C'erano molti errori, quindi li ho corretti...
 
akuloff:

Cosa?

Lo script fa OrderSelect su ogni ordine prima della cancellazione e se è selezionato significa che non è nella storia e attivo, quali sono gli errori?

Dopo aver cancellato un ordine, i numeri dei rimanenti non processati sono spostati di 1.
 
Yury Kirillov:
Dopo aver cancellato un ordine, i numeri dei rimanenti non processati sono spostati di 1.
Sistemato molto tempo fa....
 

Michael, facciamo un altro "foglio" con i ritardi, sta diventando noioso. :))))

Quando andrai all'inaugurazione? :)))))))

 
Ho una domanda per gli Expert Advisors. Come azzerare la posizione(FORTS, Otkrytie-Broker, Real)

C'è il seguente codice:

#property strict
long     gTicks=0;
int      Step=0;
//=====
void OnTick()
{
   gTicks++;
   PositionSelect(_Symbol);
   //----- Блок 1
   {if((gTicks>1000)&&(Step==0))
   {
      Print("OPEN>> *** VOLUME=",PositionGetDouble(POSITION_VOLUME),
                        " *** ID=",PositionGetInteger(POSITION_IDENTIFIER),
                        " *** TYPE=",EnumToString((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)),
                        " *** OrdersTotal()=",OrdersTotal());
      MqlTradeRequest request={0};                                   //Обнулим записи запроса
      MqlTradeResult result={0};                                     //Обнулим записи ответа
      request.action=TRADE_ACTION_PENDING;                           //Отложенный ордер
      request.symbol=_Symbol;                                        //Инструмент
      request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);            //Прайс (цена) исполнения ордера
      request.type=ORDER_TYPE_SELL_STOP;                             //Тип ордера
      request.type_filling=ORDER_FILLING_RETURN;                     //Разрешить исполнять частями (ORDER_FILLING_RETURN)
      request.type_time=ORDER_TIME_SPECIFIED_DAY;                    //В очереди до экспирации
      request.expiration=
         (datetime)SymbolInfoInteger(_Symbol,SYMBOL_EXPIRATION_TIME);//Время истечения фьючерсного контракта
      request.volume=1;                                              //Объем
      Print("OPEN OrderSend=",OrderSend(request,result));
      Print("OPEN Retcode=",result.retcode);
      Print("OPEN Order=",result.order);
      Print("OPEN Deal=",result.deal);
      Print("OPEN OrdersTotal()=",OrdersTotal());
      Print("OPEN Volume=",PositionGetDouble(POSITION_VOLUME));
      Step=1;
      return;
   }}//if((gTicks>1000)&&(Step==0))
   //----- Блок 2
   {if((gTicks>2000)&&(Step==1))
   {
   Print("CLOSE>> *** VOLUME=",PositionGetDouble(POSITION_VOLUME),
                     " *** ID=",PositionGetInteger(POSITION_IDENTIFIER),
                     " *** TYPE=",EnumToString((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)),
                     " *** OrdersTotal()=",OrdersTotal());
      MqlTradeRequest request={0};                                   //Обнулим записи запроса
      MqlTradeResult result={0};                                     //Обнулим записи ответа
      request.action=TRADE_ACTION_DEAL;                              //Отложенный ордер
      request.symbol=_Symbol;                                        //Инструмент
      request.price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);            //Прайс (цена) исполнения ордера
      request.type=ORDER_TYPE_BUY;                                   //тип ордера
      request.type_filling=ORDER_FILLING_FOK;                        //Исполнять только в полном объёме
      request.type_time=ORDER_TIME_DAY;                              //В очереди до снятия
      request.volume=1;                                              //Объем Правильно
      Print("CLOSE OrderSend=",OrderSend(request,result));
      Print("CLOSE Retcode=",result.retcode);
      Print("CLOSE Order=",result.order);
      Print("CLOSE Deal=",result.deal);
      Print("CLOSE OrdersTotal()=",OrdersTotal());
      Print("CLOSE Volume=",PositionGetDouble(POSITION_VOLUME));
      Step=2;
      return;
   }}//if((gTicks>2000)&&(Step==1))        
   //----- Блок 3
   {if((gTicks>3000)&&(Step==2))
   {
      Print("INFO>> *** VOLUME=",PositionGetDouble(POSITION_VOLUME),
                        " *** ID=",PositionGetInteger(POSITION_IDENTIFIER),
                        " *** TYPE=",EnumToString((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)),
                        " *** OrdersTotal()=",OrdersTotal());
      Step=3;
      return;
   }}//if((gTicks>3000)&&(Step==2))
   {if((gTicks>4000)&&(Step==3))
   {
      ExpertRemove();
   }}//if((gTicks>4000)&&(Step==3))
}//OnTick()

Cioè,apriamo una posizionecon un ordine, la chiudiamo con un ordine inverso e guardiamo il volume della posizione come risultato.

Ci aspettiamo 0 (zero), abbiamo 1 (uno). I registri sono qui sotto (inizia dal basso).

2015.10.27 16:28:11.476 2015.10.26 10:05:08   ExpertRemove() function called
2015.10.27 16:28:11.465 2015.10.26 10:03:14   INFO>> *** VOLUME=1.0 *** ID=2 *** TYPE=POSITION_TYPE_SELL *** OrdersTotal()=0
2015.10.27 16:28:11.450 2015.10.26 10:01:47   CLOSE Volume=1.0
2015.10.27 16:28:11.450 2015.10.26 10:01:47   CLOSE OrdersTotal()=0
2015.10.27 16:28:11.450 2015.10.26 10:01:47   CLOSE Deal=3
2015.10.27 16:28:11.450 2015.10.26 10:01:47   CLOSE Order=3
2015.10.27 16:28:11.450 2015.10.26 10:01:47   CLOSE Retcode=10009
2015.10.27 16:28:11.450 2015.10.26 10:01:47   CLOSE OrderSend=true
2015.10.27 16:28:11.449 2015.10.26 10:01:47   order performed buy 1.00 at 9249 [#3  buy 1.00 SBRF-12.15 at 9249]
2015.10.27 16:28:11.449 2015.10.26 10:01:47   deal performed [#3  buy 1.00 SBRF-12.15 at 9249]
2015.10.27 16:28:11.449 2015.10.26 10:01:47   deal #3  buy 1.00 SBRF-12.15 at 9249 done (based on order #3)
2015.10.27 16:28:11.449 2015.10.26 10:01:47   exchange buy 1.00 SBRF-12.15 at 9249 (9242 / 9249 / 9242)
2015.10.27 16:28:11.449 2015.10.26 10:01:47   CLOSE>> *** VOLUME=1.0 *** ID=2 *** TYPE=POSITION_TYPE_SELL *** OrdersTotal()=0
2015.10.27 16:28:11.422 2015.10.26 10:00:57   order performed sell 1.00 at 9205 [#2  sell stop 1.00 SBRF-12.15 at 9205]
2015.10.27 16:28:11.422 2015.10.26 10:00:57   deal performed [#2  sell 1.00 SBRF-12.15 at 9205]
2015.10.27 16:28:11.422 2015.10.26 10:00:57   deal #2  sell 1.00 SBRF-12.15 at 9205 done (based on order #2)
2015.10.27 16:28:11.422 2015.10.26 10:00:57   order [#2  sell stop 1.00 SBRF-12.15 at 9205] triggered
2015.10.27 16:28:11.422 2015.10.26 10:00:57   OPEN Volume=0.0
2015.10.27 16:28:11.422 2015.10.26 10:00:57   OPEN OrdersTotal()=1
2015.10.27 16:28:11.422 2015.10.26 10:00:57   OPEN Deal=0
2015.10.27 16:28:11.422 2015.10.26 10:00:57   OPEN Order=2
2015.10.27 16:28:11.422 2015.10.26 10:00:57   OPEN Retcode=10009
2015.10.27 16:28:11.422 2015.10.26 10:00:57   OPEN OrderSend=true
2015.10.27 16:28:11.422 2015.10.26 10:00:57   sell stop 1.00 SBRF-12.15 at 9205 (9205 / 9227 / 9205)
2015.10.27 16:28:11.422 2015.10.26 10:00:57   OPEN>> *** VOLUME=0.0 *** ID=0 *** TYPE=POSITION_TYPE_BUY *** OrdersTotal()=0
2015.10.27 16:28:11.344 SBRF-12.15,M1: testing of Experts\Projects\CoinAge5\Helper_v01\mq5\Tst\TST006_Open_Close_Positions_001.ex5 from 2015.10.26 00:00 to 2015.10.27 00:00 started

Qual è la ragione?

 
Yury Kirillov:
Ecco una domanda che ho, per gli intenditori. Come azzerare una posizione(FORTS, Otkrytie-Broker, Real)

C'è il seguente codice:

Cioè,apriamo una posizionecon un ordine, la chiudiamo con un ordine inverso e guardiamo il volume della posizione come risultato.

Ci aspettiamo 0 (zero), abbiamo 1 (uno). I registri sono qui sotto (inizia dal basso).

Qual è la ragione?

Non è più semplice?

#include <Trade\Trade.mqh>
CTrade Trade;

void OnTick()
{
   Trade.PositionClose(Symbol());
}

?

 
Yury Kirillov:

Qual è la ragione?

In PositionGet senza PositionSelect prima.
 
Vasiliy Sokolov:

Non è più semplice:

?

No, non lo è. È così che mi occupo del mio codice, mentre nella tua versione dovrei analizzare una libreria non scritta da me. Se guardate all'interno di questa libreria, troverete circa la stessa serie di operazioni che faccio io. Ecco perché voglio prima capire il meccanismo di immissione degli ordini su FORTS, e poi, forse, utilizzare le librerie standard.