Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 463

 

Wie kann man das Positionsvolumen auf 0 (Null) setzen? (FORTS, Otkrytie-Broker, Real)

Wir haben den folgenden Code:

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

Das heißt, wir eröffnen eine Position mit einem Auftrag, schließen sie mit einem umgekehrten Auftrag und betrachten das daraus resultierende Positionsvolumen.

Wir erwarten 0 (null) und haben 1 (eins). Protokolle unten (Anfang 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:

Wie kann man das Positionsvolumen auf 0 (Null) setzen? (FORTS, Otkrytie-Broker, Real)

Wir haben den folgenden Code:

Das heißt, wir eröffnen eine Position mit einem Auftrag, schließen sie mit einem umgekehrten Auftrag und betrachten das daraus resultierende Positionsvolumen.

Wir erwarten 0 (null) und haben 1 (eins). Protokolle unten (Anfang unten).

Was ist der Grund dafür?

Vielen Dank für Ihre Aufmerksamkeit! Ich habe eine Erklärung in einem benachbarten Thread gefunden. :-)
 
Alexey Viktorov:
Das ist richtig. Als ich diese Formel schrieb, war mein SL nicht durch einen vordefinierten Wert definiert, sondern wurde als Differenz zwischen dem Eröffnungskurs der Order und einem bestimmten Niveau berechnet, so dass ich den Risikobetrag mit _Point multiplizieren musste
Dann sollten Sie dividieren, nicht multiplizieren.
 

Hallo zusammen, ich komme mit einem Problem nicht zurecht... Bitte um Hilfe!!! Es gab einen Expert Advisor mit Martingale (2SS), ich habe fast alles überarbeitet - jetzt öffnet er auch nach Trend. Es gibt einen Block, der den kumulierten Gewinn von separat geschlossenen Aufträgen zählt und auf "0" zurückgesetzt wurde - wenn die gesamte Serie geschlossen wurde, und insbesondere der 1. offene Auftrag. Nun kann diese 1. Bestellung jederzeit geschlossen werden... Und der kumulierte Gewinn wird zunichte gemacht. AUFGABE: Halten Sie diese Flagge (Serieneröffnungen), bis ALLE Aufträge geschlossen sind, nachdem diese Flagge "erschienen" ist. Im Quellcode sah es folgendermaßen aus:

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

Vielen Dank im Voraus!

 
Artyom Trishkin:
Dann teilen Sie, nicht multiplizieren.
Sie haben sich meine Variante nicht genau angeschaut, ich habe nicht den Stop multipliziert, obwohl es ja die richtige Variante ist, sondern ich habe das Geld multipliziert, was nach 5-6 Jahren unvernünftig erscheint, aber das Ergebnis ist richtig. Ich bin all die Jahre nicht zu dieser Variante zurückgekehrt, ich habe kaum einen Expert Advisor gefunden, bei dem dies der Fall ist. Als ich sie fand, hatten Sie bereits zwei Beiträge geschrieben :)))
 
Alexey Viktorov:
Sie haben bei meiner Variante nicht genau hingeschaut, kein Stopp multipliziert, obwohl es ja die richtige Variante ist, und das Geld multipliziert, was nach 5-6 Jahren schon unvernünftig erscheint, aber das Ergebnis ist richtig. Ich bin all die Jahre nicht zu dieser Variante zurückgekehrt, ich habe kaum einen Expert Advisor gefunden, bei dem dies der Fall ist. Als ich sie fand, hatten Sie bereits zwei Beiträge geschrieben :)))

Und das mit einem Smartphone ;)

Das ist natürlich seltsam. Wenn ich den Stoppwert in Pips schreibe, ist er 300 (in seinem Beispiel). Bei fünfstelligen Kursen beträgt der Stoppwert in Pips demnach 300*0,00001=0,003

Gut. Wenn die Differenz zwischen dem erforderlichen Schlusskurs und dem Eröffnungskurs gleich 0,003 (im Kurs) ist, warum hat er sie dann multipliziert und 0,00000003 Punkte erhalten? Wenn er es geteilt hätte, hätte er 300 bekommen, wie es sich gehört.

Ich habe sogar von meinem Smartphone aus geantwortet, ohne zu merken, dass ich Ihnen und nicht dem ursprünglichen Fragesteller geantwortet habe ;)

 
Artyom Trishkin:

Und das mit einem Smartphone ;)

Das ist natürlich seltsam. Wenn ich den Stoppwert in Pips schreibe, ist er 300 (in seinem Beispiel). Bei fünfstelligen Kursen beträgt der Stoppwert in Pips demnach 300*0,00001=0,003

Gut. Wenn die Differenz zwischen dem erforderlichen Schlusskurs und dem Eröffnungskurs gleich 0,003 (im Kurs) ist, warum hat er sie dann multipliziert und 0,00000003 Punkte erhalten? Hätte er es geteilt, hätte er 300 erhalten, wie es eigentlich sein sollte.

Ich habe sogar von meinem Smartphone aus geantwortet, ohne zu merken, dass ich Ihnen und nicht dem Fragesteller geantwortet habe ;)

Und jetzt habe ich schon zu Abend gegessen und es ist mir egal, was er bekommt. :)))

Die Hauptsache ist, dass wir uns verstanden haben... :)))))))))))))))))))

 
Alexey Viktorov:

Jetzt habe ich zu Abend gegessen und es ist mir egal, was er bekommt. :)))

Das Wichtigste ist, dass wir uns verstehen... :)))))))))))))))))))

Ich bin sehr froh, dass Sie sich verstehen)) Ich, der ich noch sehr jung bin, weiß nicht, was ich dividieren und multiplizieren soll. Bitte helfen Sie mir mit den Informationen, ich würde mich freuen, einen Link zu einem Artikel, eine einfache Erklärung auf meinen Fingern zu haben, ich bin dankbar für jede Hilfe.
 
Alexey Viktorov:

Jetzt habe ich zu Abend gegessen und es ist mir egal, was er bekommt. :)))

Die Hauptsache ist, dass wir uns verstehen... :)))))))))))))))))))

Ich glaube, ich habe es, meine Herren)))

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

So funktioniert es, danke an alle)

 
PabloEs:

Ich glaube, ich habe es, meine Herren))

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

So funktioniert es, danke an alle)

Siehst du, ich habe zu Abend gegessen und du hast es in 11 Minuten erledigt. :)))
Grund der Beschwerde: