Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 168

 

Bitte sagen Sie mir, was ich falsch mache. Ich versuche, einen einfachen Indikator zu erstellen:


  {

   int limit,i;
   double last;
   int counted_bars = IndicatorCounted();
   //---- check for possible errors
   if (counted_bars < 0) 
       return(-1);
   //---- last counted bar will be recounted
   if(counted_bars > 0) 
       counted_bars--;
   limit = Bars - counted_bars;
//----
   for(i=limit; i>=0; i--)
   {
      double OptClose = Close[i]*10000;
      if (MathMod(OptClose,step1)==0)
      {
      Buffer0[i] = Close[i];
      last = Close[i];
      }
      else
      Buffer0[i] = last;
   }

//----
   return(0);
  }
//+------------------------------------------------------------------+

Es funktioniert im Chart-Fenster, aber wenn ich versuche, es im Expert Advisor zu testen, zeichnet es entweder, was auch immer es ist, oder "keine Schritte".

 
Virtuon:

Bitte sagen Sie mir, was ich falsch mache. Ich versuche, einen einfachen Indikator zu erstellen:

Es funktioniert im Chart-Fenster, aber wenn ich versuche, es im Expert Advisor zu testen, zeichnet es entweder, was auch immer es ist, oder "keine Schritte".

      if (MathMod(OptClose,step1)==0)
         Buffer0[i] = Close[i];
      else
         Buffer0[i] = Buffer0[i+1];
 
PapaYozh:

Ich habe es ausprobiert. Auch nur im Fenster funktioniert das nicht. Offenbar gibt es hier eine Art Trick. So funktioniert es jetzt, aber es ist furchtbar langsam:
 for(i=WindowBarsPerChart(); i>=0; i--)
   {
      double OptClose = Close[i]*10000;
      if (MathMod(i+step1,step1)==0)
      {
      Buffer0[i] = Close[i];
      last = Close[i];
      }
      else
      Buffer0[i] = last;
      Comment(Buffer0[WindowBarsPerChart()]," ",Buffer0[0]);
   }
Dabei ist die Überprüfung der Neuberechnung des letzten Taktes deaktiviert.
 

Hallo, MQL4-Programmiergurus! Bitte teilen Sie uns mit, wie dies möglich ist:

Ein Teil des Programmcodes:

   LogAdd("Начинаю вычисления переменных для текущего тика ... ");  
   for (int i = OrdersTotal()-1; i >= 0; i--) {
      OrderSelect(i, SELECT_BY_POS);           
      LogAdd("Выбираю ордер с тикетом: " + i); 
      if ((OrderOpenTime() > opnTime) && (OrderType() == OP_BUY) || (OrderType() == OP_SELL)) {    
         opnTime = OrderOpenTime();
         currentTicket = OrderTicket(); 
         currentStopLoss = OrderStopLoss();          
         LogAdd("Ордер открыт позже предыдущего, не является отложенным. Записываю переменные: opnTime - " + opnTime + ", currentTicket - " + currentTicket + ", currentStopLoss - " + currentStopLoss + ".");
      }
      if (OrderType() == OP_BUY) {         
         buyCntr ++;   
         buyOpnPrice = OrderOpenPrice();
         lotsSumBuy += OrderLots();
         TrailingByShadows(OrderTicket(), Period(), 11, 0); 
         LogAdd("Ордер не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - " + buyCntr + ", buyOpnPrice - " + buyOpnPrice + ", lotsSumBuy - " + lotsSumBuy + ".");  
      }  
      if (OrderType() == OP_SELL) {
         sellCntr ++;
         sellOpnPrice = OrderOpenPrice();
         lotsSumSell += OrderLots();
         TrailingByShadows(OrderTicket(), Period(), 11, 0);
         LogAdd("Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - " + sellCntr + ", sellOpnPrice - " + sellOpnPrice + ", lotsSumSell - " + lotsSumSell + ".");
      }  
      if (OrderType() == OP_SELLSTOP) {
         sellOpnPrice = OrderOpenPrice();         
         LogAdd("Ордер является отложенным, тип ордера - на продажу, фиксирую цену открытия: sellOpnPrice - " + sellOpnPrice + ".");
      }  
      if (OrderType() == OP_BUYSTOP) {
         buyOpnPrice = OrderOpenPrice();
         LogAdd("Ордер является отложенным, тип ордера - на покупку, фиксирую цену открытия: buyOpnPrice - " + buyOpnPrice + ".");
      }  
   }
   LogAdd("Вычисления переменных для текущего тика завершены."); 

Ein Stück Holz für diesen Abschnitt:

2013.10.2 15:59:0 - Начинаю вычисления переменных для текущего тика ... 
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 5
2013.10.2 15:59:0 - Ордер является отложенным, тип ордера - на продажу, фиксирую цену открытия: sellOpnPrice - 1.35250000.
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 4
2013.10.2 15:59:0 - Ордер открыт позже предыдущего, не является отложенным. Записываю переменные: opnTime - 1380728738, currentTicket - 93537240, currentStopLoss - 0.00000000.
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - 1, buyOpnPrice - 1.35620000, lotsSumBuy - 0.06000000.
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 1, sellOpnPrice - 1.35250000, lotsSumSell - 0.01000000.
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 3
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 2, sellOpnPrice - 1.35250000, lotsSumSell - 0.04000000.
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 2
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - 2, buyOpnPrice - 1.35620000, lotsSumBuy - 0.07000000.
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 3, sellOpnPrice - 1.35250000, lotsSumSell - 0.05000000.
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 1
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - 3, buyOpnPrice - 1.35620000, lotsSumBuy - 0.08000000.
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 4, sellOpnPrice - 1.35250000, lotsSumSell - 0.06000000.
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 0
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 5, sellOpnPrice - 1.35250000, lotsSumSell - 0.07000000.
2013.10.2 15:59:0 - Вычисления переменных для текущего тика завершены.
Die Frage ist, wie die Bedingungen für denselben Auftrag hätten funktionieren können:
      if (OrderType() == OP_BUY) {         
          ...
      }  
      if (OrderType() == OP_SELL) {
          ...
      } 

Ich verstehe etwas nicht, aber dann stellt sich logischerweise heraus, dass für diesen Auftrag:

OP_BUY == OP_SELL
Im Grunde ist es mir egal, warum das passiert, wichtig ist, dass sellCntr++ und buyCntr++ eindeutig für eine bestimmte Art von offenen Aufträgen ausgeführt werden, helfen Sie mir, das zu beheben?
 
Mepkypuu:

Hallo, MQL4-Programmiergurus! Bitte teilen Sie uns mit, wie dies möglich ist:

Ein Teil des Programmcodes:

Ein Stück Holz für diesen Abschnitt:

Die Frage ist, wie die Bedingungen für denselben Auftrag hätten funktionieren können:

Ich verstehe etwas nicht, aber dann stellt sich logischerweise heraus, dass für diesen Auftrag:

Im Grunde ist es mir egal, warum das passiert, wichtig ist, dass sellCntr++ und buyCntr++ eindeutig für eine bestimmte Art von offenen Aufträgen ausgeführt werden, helfen Sie mir bei der Lösung?
Woher wissen Sie, dass es sich um dieselbe Reihenfolge handelt? Sie drucken das Ticket nicht aus ;).... Ich bin mir sicher: Beim Schleppnetzfahren gibt es einen Überschuss an Aufträgen ;) - Der induzierte Fehler stammt von dort.
TrailingByShadows(OrderTicket(), Period(), 11, 0);  ?????????????????????????????? Вы при трале разве ордера не перебираете ?????????? 
 
VladislavVG:
Wie können Sie sicher sein, dass es sich um dieselbe Bestellung handelt? Sie drucken das Ticket nicht aus ;).... Ich bin mir sicher: Wenn Sie eine Schleppnetzfischerei betreiben, wird der Auftrag überbelegt ;) - Der induzierte Fehler stammt von dort.

Warum sollte ich logischerweise die Aufträge im Suchlauf durchgehen, wenn ich bereits weiß, welchen konkreten Auftrag ich durchsuchen muss? Es gibt keine rohe Gewalt, hier ist der Code:

void TrailingByShadows(int ticket,int tmfrm,int bars_n, int indent) {  
   int i;
   double new_extremum;

   if ((bars_n<1) || (indent<0) || (ticket==0) || ((tmfrm!=1) && (tmfrm!=5) && (tmfrm!=15) && (tmfrm!=30) && (tmfrm!=60) && (tmfrm!=240) && (tmfrm!=1440) && (tmfrm!=10080) && (tmfrm!=43200)) || (!OrderSelect(ticket,SELECT_BY_TICKET))) {
      Print("Трейлинг функцией TrailingByShadows() невозможен из-за некорректности значений переданных ей аргументов.");
      return(0);
   } 
   if (OrderType()==OP_BUY) {
      for(i = 1; i <= bars_n; i++) {
         if (i == 1) new_extremum = iLow(Symbol(), tmfrm, i); 
         else if (new_extremum > iLow(Symbol(), tmfrm, i)) new_extremum = iLow(Symbol(), tmfrm, i);
      }
      if(((new_extremum - indent * Point) > OrderStopLoss() + 1.0 * Point) || (OrderStopLoss() == 0))
      if((new_extremum - indent * Point) > OrderOpenPrice())
      if(new_extremum - indent * Point < Bid - MarketInfo(Symbol(), MODE_STOPLEVEL) * Point)
      if(AcountProfitEx(new_extremum) > ProfitSize)
      OrderModify(ticket, OrderOpenPrice(), new_extremum - indent * Point, OrderTakeProfit(), OrderExpiration());
   }
   
   if (OrderType() == OP_SELL) {
      for(i = 1; i <= bars_n; i++) {
         if (i == 1) new_extremum = iHigh(Symbol(), tmfrm, i); 
         else if (new_extremum < iHigh(Symbol(), tmfrm, i)) new_extremum = iHigh(Symbol(), tmfrm, i);
      }
      if (((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD)) * Point) < OrderStopLoss() - 1.0 * Point) || (OrderStopLoss() == 0)) 
      if ((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD)) * Point) < OrderOpenPrice())                          
      if ((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD)) * Point > Ask + MarketInfo(Symbol(),MODE_STOPLEVEL) * Point)) 
      if (AcountProfitEx(new_extremum) > ProfitSize)
      OrderModify(ticket, OrderOpenPrice(), new_extremum + (indent + MarketInfo(Symbol(), MODE_SPREAD)) * Point, OrderTakeProfit(), OrderExpiration());
   }      
}
PS: Dieses Problem tritt übrigens nur unter realen Bedingungen auf, d.h. es wird nicht im Testgerät reproduziert.
 
Liebe Programmierer, könnten Sie mir bitte sagen, warum ich, als ich meinen Computer neu gestartet habe, beim Öffnen des Terminals statt eines normalen Charts ein graues Fenster sah und die offenen Positionen, EA und Indikatoren verloren habe, aber als ich einen neuen Chart öffnete, erschienen die Positionen, aber es gab keine EA und Indikatoren, ich musste sie erneut installieren. Was hat das mit der Sache zu tun? Ich musste sie wieder einbauen. Danke.
 

Ein solches Problem ist aufgetreten. Der Strategietester funktioniert nur einmal. Genauer gesagt wird der Visualisierungstest einmal ausgelöst, und wenn Sie das nächste Mal auf die Schaltfläche "Start" drücken, wird das Kontrollkästchen "Visualisierung" zurückgesetzt, und es passiert nichts (sozusagen gar nichts). Wie lässt sich das verhindern?

 
Mepkypuu:

Warum sollte ich logischerweise die Aufträge im Suchlauf durchgehen, wenn ich bereits weiß, welchen konkreten Auftrag ich durchsuchen muss? Es gibt keine rohe Gewalt, hier ist der Code:

PS: Dieses Problem tritt übrigens nur unter realen Bedingungen auf, d.h. es wird nicht im Testgerät reproduziert.


Versuchen Sie, ihn in dieser Variante auszuführen:

   LogAdd("Начинаю вычисления переменных для текущего тика ... ");  
   for (int i = OrdersTotal()-1; i >= 0; i--) 
   {
      if(!OrderSelect(i, SELECT_BY_POS)) continue;           
      int OrdType=OrderType() ;
      int OrdTckt = OrderTicket(); 
      LogAdd("Выбираю ордер ( "+i+" ) с тикетом: " + OrdTckt); 
      if ((OrderOpenTime() > opnTime) && (OrdType == OP_BUY) || (OrdType == OP_SELL)) {    
         opnTime = OrderOpenTime();
         currentTicket = OrderTicket(); 
         currentStopLoss = OrderStopLoss();          
         LogAdd("Ордер открыт позже предыдущего, не является отложенным. Записываю переменные: opnTime - " + opnTime + ", currentTicket - " + currentTicket + ", currentStopLoss - " + currentStopLoss + ".");
      }
      if (OrdType == OP_BUY) 
      {         
         buyCntr ++;   
         buyOpnPrice = OrderOpenPrice();
         lotsSumBuy += OrderLots();
         TrailingByShadows(OrderTicket(), Period(), 11, 0); 
         LogAdd("Ордер "+OrdTckt  <-> OrderTicket()+" не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - " + buyCntr + ", buyOpnPrice - " + buyOpnPrice + ", lotsSumBuy - " + lotsSumBuy + ".");  
      }  
      if (OrdType== OP_SELL) 
      {
         sellCntr ++;
         sellOpnPrice = OrderOpenPrice();
         lotsSumSell += OrderLots();
         TrailingByShadows(OrderTicket(), Period(), 11, 0);
         LogAdd("Ордер "+OrdTckt  <-> OrderTicket()+" не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - " + sellCntr + ", sellOpnPrice - " + sellOpnPrice + ", lotsSumSell - " + lotsSumSell + ".");
      }  
      if (OrderType() == OP_SELLSTOP) 
      {
         sellOpnPrice = OrderOpenPrice();         
         LogAdd("Ордер "+OrdTckt  <-> OrderTicket()+" является отложенным, тип ордера - на продажу, фиксирую цену открытия: sellOpnPrice - " + sellOpnPrice + ".");
      }  
      if (OrderType() == OP_BUYSTOP) 
      {
         buyOpnPrice = OrderOpenPrice();
         LogAdd("Ордер "+OrdTckt  <-> OrderTicket()+" является отложенным, тип ордера - на покупку, фиксирую цену открытия: buyOpnPrice - " + buyOpnPrice + ".");
      }  
   }
   LogAdd("Вычисления переменных для текущего тика завершены."); 

Mal sehen, was das Protokoll sagt.

 
Ist es möglich, die Einrückung programmatisch und nicht über die Vorlage festzulegen? Ich kann die Größe der Einrückung durch
WindowBarsPerChart() - WindowFirstVisibleBar() - 2;

man kann, aber wie man es aufdeckt.

Hinzugefügt

Es scheint, dass Sie dies programmatisch über Vorlagen tun können. Erstellen Sie eine Vorlage mit einem Indikator, mit _lread kernel32.dll lesen shift_size Wert, mit _lwrite schreiben es eine Zahl von 10 bis 50, wie solche Bereiche können diesen Parameter akzeptieren, dann durch InternalMsg eine Vorlage laden. Aber wir wissen nicht, ob es 33511 oder 35511 ist. In WinUser32.mqh ist es die erste Option, während es im Forum die zweite ist. Die Frage muss an Junko gerichtet werden. Es ist viel einfacher in MT5. CHART_SHIFT_SIZE ist dort durch ChartSetString() und ChartGetString() von jedem Punkt im Code verfügbar... Vielleicht gibt es andere Optionen in MT4? Dumme Frage, aber...