Questions des débutants MQL5 MT5 MetaTrader 5 - page 463

 

Comment faire pour que le volume de la position soit à 0 (zéro) ? (FORTS, Otkrytie-Broker, Real)

Nous avons le code suivant :

#property strict
long     gTicks=0;
int      Step=0;
//=====
void OnTick()
{
   gTicks++;
   PositionSelect(_Symbol);
   //-----
   {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))
   //-----
   {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))        
   //-----   
   {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 position avec un ordre, la fermons avec un ordre inverse, et examinons le volume de la position en conséquence.

Nous attendons 0 (zéro) et nous avons 1 (un). Journaux de bord ci-dessous (en commençant par le 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:

Comment faire pour que le volume de la position soit à 0 (zéro) ? (FORTS, Otkrytie-Broker, Real)

Nous avons le code suivant :

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

Nous attendons 0 (zéro) et nous avons 1 (un). Journaux de bord ci-dessous (en commençant par le bas).

Quelle en est la raison ?

Merci de votre attention ! J'ai obtenu une explication dans un fil voisin. :-)
 
Alexey Viktorov:
Exactement. Lorsque j'ai écrit cette formule, mon SL n'était pas défini par une valeur prédéfinie, mais était calculé comme la différence entre le prix d'ouverture de l 'ordre et un certain niveau, j'ai donc dû multiplier le montant du risque par _Point.
Dans ce cas, vous devez diviser, et non multiplier.
 

Bonjour à tous ! Je n'arrive pas à résoudre un problème... S'il vous plaît aider !!! Il y avait un conseiller expert avec Martingale (2SS), j'ai retravaillé presque tout - maintenant il ouvre aussi par tendance. Il y a un bloc qui compte le profit accumulé des ordres fermés séparément et qui a été remis à "0" - lorsque toute la série a été fermée, et en particulier le 1er ordre ouvert. Maintenant, cette 1ère commande peut être fermée à tout moment... Et le bénéfice accumulé est annulé. TASK : Maintenir ce drapeau (ouvertures de séries) jusqu'à ce que TOUS les ordres soient fermés après que ce drapeau soit "apparu". Dans le code source, ça ressemblait à ça :

  if(OrderSelect(TicketB[totb-1],SELECT_BY_TICKET)) TimeB=OrderOpenTime();
  if(OrderSelect(TicketS[tots-1],SELECT_BY_TICKET)) TimeS=OrderOpenTime();
.......//...........//...........//............//............//........
         if(!OrderSelect(k,SELECT_BY_POS,MODE_HISTORY)) break;
         if((OrderOpenTime()<TimeB || totb==0) && (OrderOpenTime()<TimeS || tots==0)) break;
         if(OrderSymbol()==Symbol())
           {
            if((OrderMagicNumber()==magicbuy || OrderMagicNumber()==magicbuyTrEnd) && OrderType()==OP_BUY  && OrderOpenTime()>TimeB) ProfitBuyN  += OrderProfit()+OrderSwap()+OrderCommission();
            if((OrderMagicNumber()==magicsell || OrderMagicNumber()==magicsellTrEnd) && OrderType()==OP_SELL && OrderOpenTime()>TimeS) ProfitSellN += OrderProfit()+OrderSwap()+OrderCommission();
           }

Merci d'avance !

 
Artyom Trishkin:
Alors divisez, ne multipliez pas.
Vous n'avez pas regardé attentivement ma variante, je n'ai pas multiplié le stop, bien que ce soit effectivement la bonne variante, mais j'ai multiplié l'argent, ce qui après 5-6 ans semble déraisonnable, mais le résultat est correct. Je ne suis pas revenu sur cette variante toutes ces années, j'ai difficilement trouvé un Expert Advisor où cela est fait. Le temps que je le trouve, vous aviez déjà écrit deux posts :))))
 
Alexey Viktorov:
Vous n'avez pas regardé de près ma variante, pas un stop multiplié, bien qu'effectivement aussi la variante correcte, et l'argent multiplié, ce qui après 5-6 ans semble déjà déraisonnable, mais le résultat est correct. Je ne suis pas revenu sur cette variante toutes ces années, j'ai difficilement trouvé un Expert Advisor où cela est fait. Le temps que je le trouve, vous aviez déjà écrit deux posts :))))

Et depuis un smartphone ;)

C'est étrange, bien sûr. Si j'ai écrit la valeur du stop en pips, elle est de 300 (dans son exemple). Il l'a multiplié par _Point. Par conséquent, aux cotations à cinq chiffres, la valeur stop en pips est de 300*0,00001=0,003.

Ok. Si la différence entre le prix de clôture nécessaire et le prix d'ouverture est égale à 0,003 (dans le prix), pourquoi l'a-t-il multiplié et obtenu 0,00000003 points ? S'il l'avait divisé, il aurait obtenu 300 comme il se doit.

En fait, j'ai répondu depuis mon smartphone, sans même me rendre compte que je vous répondais à vous et non à l'auteur de la question initiale ;)

 
Artyom Trishkin:

Et depuis un smartphone ;)

C'est étrange, bien sûr. Si j'ai écrit la valeur du stop en pips, elle est de 300 (dans son exemple). Il l'a multiplié par _Point. Par conséquent, aux cotations à cinq chiffres, la valeur stop en pips est de 300*0,00001=0,003.

Ok. Si la différence entre le prix de clôture nécessaire et le prix d'ouverture est égale à 0,003 (dans le prix), pourquoi l'a-t-il multiplié et obtenu 0,00000003 points ? S'il l'avait divisé, il aurait obtenu 300 comme il est censé l'être.

En fait, je répondais depuis mon smartphone sans même me rendre compte que je vous répondais à vous et non à l'auteur de la question au début ;).

Et maintenant, j'ai déjà dîné et je me fiche de ce qu'il prend. :)))

L'essentiel est que nous nous comprenions... :)))))))))))))))))))

 
Alexey Viktorov:

Maintenant, j'ai eu mon dîner et je me fiche de ce qu'il aura. :)))

L'important, c'est que toi et moi, nous nous comprenions... :)))))))))))))))))))

Je suis très heureux que vous vous compreniez)) Moi qui suis très jeune, je ne sais pas quoi diviser et multiplier. S'il vous plaît, aidez-moi avec les informations, je serais heureux d'avoir un lien vers un article, une explication simple sur mes doigts, je suis reconnaissant pour toute aide.
 
Alexey Viktorov:

Maintenant, j'ai eu mon dîner et je me fiche de ce qu'il aura. :)))

L'essentiel est que vous et moi nous comprenions... :)))))))))))))))))))

Je pense que je l'ai, messieurs))).

double Test=100/(300*SymbolInfoDouble(_Symbole,SYMBOL_TRADE_TICK_VALUE)) ;

C'est comme ça que ça marche, merci à tous)

 
PabloEs:

Je pense que je l'ai, messieurs))

double Test=100/(300*SymbolInfoDouble(_Symbole,SYMBOL_TRADE_TICK_VALUE)) ;

C'est comme ça que ça marche, merci à tous)

Tu vois, j'avais un dîner et tu l'as fait en 11 minutes. :)))