FORTS. Fragen der Durchsetzung - Seite 58

 
Andrey Khatimlianskii:
Richtig, die Netzwerklatenz. Außerdem dauert es lange, bis die Bestellung abgeschickt (oder bestätigt) wird, und das Ereignis geht verloren.

Nein, ist es nicht!

1. es handelt sich nicht um eine "Netzwerk"-Verzögerung, sondern um eine Verzögerung des MT5-Servers(vielleicht die Hardware des Brokers)

2) TradeTransaction geht NICHT immer verloren (ALWAYS), wie oben zu sehen, betrug die Verzögerung 409 ms und das Ereignis ging nicht verloren

Deshalbbehaupte ich, dass nicht das Netzwerk, sondern der MT5-Server (die Hardware des Brokers) für die Verzögerungen verantwortlich ist.

Die Server-Antwortzeit der Funktion CheckOrders() beträgt 700 bis 1200 ms (je nach

zu welchem Zeitpunkt des Timers (Zeitraum 500 ms) der Befehl gesendet wurde), was 100-mal länger ist als die Laufzeit (in meiner Konfiguration) im normalen Modus ( 7-9 ms)

Die Tatsache, dass bei einer Verzögerung von 18 ms das Ereignis verloren ging und bei 409 ms nicht, erlaubt uns zu sagen, dass dies ein "Bug" des MT5-Servers ist und nicht andere

Ursachen.

Außerdem... Mein Freund, der in meinem Haus wohnt, tauscht auf zwei Terminals mit meinem Roboter über meinen ISP über denselben Router im Haus, und aus irgendeinem Grund hat er

keine Latenzzeit zu der Zeit!

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, bitte editieren Sie die Beiträge nicht. Fügen Sie besser neue hinzu, damit Sie nicht mit den Augen nach Aktualisierungen suchen müssen.
 
Andrey Khatimlianskii:
Michael, bitte editieren Sie die Beiträge nicht. Fügen Sie besser neue hinzu, damit Sie nicht mit den Augen nach Aktualisierungen suchen müssen.
Es gab eine Menge Fehler, also habe ich sie korrigiert...
 
akuloff:

Wie?

Das Skript führt OrderSelect für jede Bestellung vor der Löschung aus, und wenn sie ausgewählt ist, bedeutet dies, dass sie nicht in der Historie und aktiv ist, was sind die Fehler?

Nach dem Streichen eines Auftrags werden die Nummern der verbleibenden unbearbeiteten Aufträge um 1 verschoben.
 
Yury Kirillov:
Nach dem Streichen eines Auftrags werden die Nummern der verbleibenden unbearbeiteten Aufträge um 1 verschoben.
Schon vor langer Zeit aussortiert....
 

Michael, lass uns noch ein "Blatt" mit Verspätungen machen, es wird langweilig. :))))

Wann werden Sie zur Eröffnung gehen? :)))))))

 
Ich habe eine Frage an Expert Advisors. Wie kann man die Position auf Null setzen(FORTS, Otkrytie-Broker, Real)?

Es gibt den folgenden Code:

#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()

Das heißt,wir eröffnen eine Positionmit einem Auftrag, schließen sie mit einem umgekehrten Auftrag und betrachten das Volumen der Position als Ergebnis.

Wir erwarten 0 (null), wir haben 1 (eins). Die Protokolle finden Sie unten (beginnen Sie ganz unten).

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

Was ist der Grund dafür?

 
Yury Kirillov:
Ich habe da eine Frage an die Kenner. Wie kann man eine Position nullen(FORTS, Otkrytie-Broker, Real)?

Es gibt den folgenden Code:

Das heißt,wir eröffnen eine Positionmit einem Auftrag, schließen sie mit einem umgekehrten Auftrag und betrachten das Volumen der Position als Ergebnis.

Wir erwarten 0 (null), wir haben 1 (eins). Die Protokolle finden Sie unten (beginnen Sie ganz unten).

Was ist der Grund dafür?

Ist das nicht einfacher?

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

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

?

 
Yury Kirillov:

Was ist der Grund dafür?

In PositionGet ohne vorheriges PositionSelect.
 
Vasiliy Sokolov:

Ist es nicht einfacher:

?

Nein, das ist es nicht. So gehe ich mit meinem eigenen Code um, während ich in Ihrer Version eine nicht von mir geschriebene Bibliothek analysieren müsste. Wenn Sie einen Blick in diese Bibliothek werfen, werden Sie in etwa die gleichen Operationen finden wie ich. Deshalb möchte ich zunächst den Mechanismus der Auftragserteilung auf FORTS verstehen und dann vielleicht die Standardbibliotheken verwenden.