Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 463

 

Come ottenere il volume di posizione a 0 (zero)? (FORTS, Otkrytie-Broker, Real)

Abbiamo il seguente codice:

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

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

Ci aspettiamo 0 (zero) e abbiamo 1 (uno). Registri qui sotto (inizio sotto).

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:

Come ottenere il volume di posizione a 0 (zero)? (FORTS, Otkrytie-Broker, Real)

Abbiamo il seguente codice:

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

Ci aspettiamo 0 (zero) e abbiamo 1 (uno). Registri qui sotto (inizio sotto).

Qual è la ragione?

Grazie per l'attenzione! Ho una spiegazione in un thread vicino. :-)
 
Alexey Viktorov:
Esattamente giusto. Quando ho scritto questa formula, il mio SL non era definito da un valore predefinito, ma era calcolato come la differenza tra il prezzo aperto dell'ordine e un certo livello, quindi ho dovuto moltiplicare l'importo del rischio per _Point
Allora dovreste dividere, non moltiplicare.
 

Ciao a tutti, non riesco a risolvere un problema... Per favore aiutatemi!!! C'era un Expert Advisor con Martingale (2SS), ho rielaborato quasi tutto - ora si apre anche per Trend. C'è un blocco che conta il profitto accumulato degli ordini chiusi separatamente ed è stato resettato a "0" - quando tutta la serie è stata chiusa, e in particolare il 1° ordine aperto. Ora questo 1° ordine può chiudersi in qualsiasi momento... E il profitto accumulato è annullato. COMPITO: mantenere questa bandiera (aperture in serie) fino a quando TUTTI gli ordini sono chiusi dopo che questa bandiera è "apparsa". Nel codice sorgente, sembrava così:

  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();
           }

Grazie in anticipo!

 
Artyom Trishkin:
Allora dividete, non moltiplicate.
Non hai guardato attentamente la mia variante, non ho moltiplicato lo stop, anche se è effettivamente la variante giusta, ma ho moltiplicato il denaro, che dopo 5-6 anni sembra irragionevole, ma il risultato è corretto. Non sono tornato a questa variante in tutti questi anni, difficilmente ho trovato un Expert Advisor dove questo viene fatto. Quando l'ho trovato, avevi già scritto due post :)))
 
Alexey Viktorov:
Non hai guardato attentamente la mia variante, non un arresto moltiplicato, anche se in effetti anche la variante corretta, e il denaro moltiplicato, che dopo 5-6 anni già sembra irragionevole, ma il risultato è corretto. Non sono tornato a questa variante in tutti questi anni, difficilmente ho trovato un Expert Advisor dove questo viene fatto. Quando l'ho trovato, avevi già scritto due post :)))

E da uno smartphone ;)

È strano, naturalmente. Se ho scritto il valore di stop in pip, è 300 (nel suo esempio). L'ha moltiplicato per _Point. Di conseguenza, alle quotazioni a cinque cifre il valore di stop in pip è 300*0.00001=0.003

Ok. Se la differenza tra il prezzo di chiusura necessario e il prezzo aperto è uguale a 0,003 (nel prezzo), perché l'ha moltiplicato e ha ottenuto 0,00000003 punti? Se l'avesse diviso, avrebbe ottenuto 300 come dovrebbe.

Infatti, ho risposto dal mio smartphone, senza nemmeno rendermi conto che stavo rispondendo a te e non all'autore della domanda originale ;)

 
Artyom Trishkin:

E da uno smartphone ;)

È strano, naturalmente. Se ho scritto il valore di stop in pip, è 300 (nel suo esempio). L'ha moltiplicato per _Point. Di conseguenza, alle quotazioni a cinque cifre il valore di stop in pip è 300*0.00001=0.003

Ok. Se la differenza tra il prezzo di chiusura necessario e il prezzo aperto è uguale a 0,003 (nel prezzo), perché l'ha moltiplicato e ha ottenuto 0,00000003 punti? Se l'avesse diviso, avrebbe ottenuto 300 come dovrebbe essere.

In effetti, stavo rispondendo dal mio smartphone senza nemmeno rendermi conto che stavo rispondendo a te e non a chi faceva la domanda all'inizio ;)

E ora ho già cenato e non mi interessa cosa prende. :)))

La cosa principale è che ci siamo capiti... :)))))))))))))))))))

 
Alexey Viktorov:

Ora ho avuto la mia cena e non mi interessa cosa prende lui. :)))

L'importante è che io e te ci capiamo... :)))))))))))))))))))

Sono molto contento che vi capite)) Io, che sono molto giovane, non so cosa dividere e moltiplicare. Per favore aiutatemi con le informazioni, sarei felice di avere un link a un articolo, una semplice spiegazione sulle mie dita, sono grato per qualsiasi aiuto.
 
Alexey Viktorov:

Ora ho avuto la mia cena e non mi interessa cosa prende lui. :)))

La cosa principale è che io e te ci capiamo... :)))))))))))))))))))

Penso di aver capito, signori)))

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

È così che funziona, grazie a tutti)

 
PabloEs:

Penso di aver capito, signori))

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

È così che funziona, grazie a tutti)

Vedi, io ho cenato e tu l'hai fatto in 11 minuti. :)))
Motivazione: