FORTS. Questions relatives à l'application de la loi - page 58

 
Andrey Khatimlianskii:
C'est vrai, la latence du réseau. L'envoi (ou la confirmation) de la commande prend beaucoup de temps et l'événement est perdu.

Non, ce n'est pas le cas !

1. Il ne s'agit pas d'un retard "réseau", mais d'un retard du serveur MT5(peut-être le matériel du courtier).

2. la TradeTransaction n'est PAS toujours perdue (TOUJOURS), comme vu ci-dessus, le délai était de 409 ms et l' événement n'a pas été perdu.

C'estpourquoi je soutiens que ce n'est pas le réseau mais le serveur MT5 (le matériel du courtier) qui est responsable des retards.

Le temps de réponse du serveur pour la fonction CheckOrders() est de 700 à 1200 ms (en fonction de l'utilisation de la fonction).

à quel moment du timer (période 500 ms) la commande a été envoyée), ce qui est 100 fois plus long que le temps d'exécution (dans ma configuration) en mode normal ( 7-9 ms)

Le fait qu'avec un délai de 18 ms l'événement a été perdu, et qu'avec 409 ms il ne l'a pas été, nous permet de dire qu'il s'agit d'un "bug" du serveur MT5 et non d'autres

causes.

Aussi... Mon ami, qui vit dans ma maison, effectue des transactions sur deux terminaux avec mon robot par l'intermédiaire de mon ISP via le même routeur dans la maison, et pour une raison quelconque, il...

aucune latence à ce moment-là !

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, s'il te plaît, ne modifie pas les messages. Mieux vaut en ajouter de nouveaux pour ne pas avoir à chercher les mises à jour du regard.
 
Andrey Khatimlianskii:
Michael, s'il te plaît, ne modifie pas les messages. Mieux vaut en ajouter de nouveaux, pour ne pas avoir à chercher les mises à jour du regard.
Il y avait beaucoup d'erreurs, alors je les ai corrigées...
 
akuloff:

Quoi ?

Le script fait OrderSelect sur chaque commande avant de la supprimer et si elle est sélectionnée, cela signifie qu'elle n'est pas dans l'historique et active, quelles sont les erreurs ?

Après avoir supprimé un ordre, les numéros des ordres restants non traités sont décalés de 1.
 
Yury Kirillov:
Après avoir supprimé un ordre, les numéros des ordres restants non traités sont décalés de 1.
Réglé il y a longtemps....
 

Michael, faisons une autre "feuille" avec des retards, ça devient ennuyeux. :))))

Quand allez-vous à l'ouverture ? :)))))))

 
J'ai une question concernant les conseillers experts. Comment remettre la position à zéro ?(FORTS, Otkrytie-Broker, Real)

Il y a le code suivant :

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

En d'autres termes,nous ouvrons une positionavec un ordre, la fermons avec un ordre inverse, et examinons le volume de la position en conséquence.

Nous attendons 0 (zéro), nous avons 1 (un). Les journaux sont ci-dessous (commencez en bas).

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

Quelle en est la raison ?

 
Yury Kirillov:
Voici une question que je pose aux connaisseurs. Comment remettre à zéro une position ?(FORTS, Otkrytie-Broker, Real)

Il y a le code suivant :

En d'autres termes,nous ouvrons une positionavec un ordre, la fermons avec un ordre inverse, et examinons le volume de la position en conséquence.

Nous attendons 0 (zéro), nous avons 1 (un). Les journaux sont ci-dessous (commencez en bas).

Quelle en est la raison ?

N'est-ce pas plus simple ?

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

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

?

 
Yury Kirillov:

Quelle en est la raison ?

Dans PositionGet sans PositionSelect au préalable.
 
Vasiliy Sokolov:

Ce n'est pas plus simple :

?

Non, ça ne l'est pas. C'est ainsi que je traite mon propre code, alors que dans votre version, je devrais analyser une bibliothèque que je n'ai pas écrite. Si vous regardez à l'intérieur de cette bibliothèque, vous trouverez à peu près le même ensemble d'opérations que moi. C'est pourquoi je veux d'abord comprendre le mécanisme de passation des ordres sur FORTS, et ensuite, peut-être, utiliser les bibliothèques standard.