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

 
MarkTrade:


Es funktioniert... Ich danke Ihnen!

Ich wünschte nur, ich würde verstehen, warum meine Version nicht funktionieren will...

Erkennen Sie nicht den Unterschied? Sie haben einen falschen Vergleich.

if (a && b < c) - das ist nicht möglich.

if (a<c && b<c) - das funktioniert

 
artmedia70:

Erkennen Sie nicht den Unterschied? Sie haben den falschen Vergleich.

if (a && b < c) - das ist nicht möglich.

if (a<c && b<c) - Sie können.



Nein, ich habe den Unterschied bemerkt. Ich habe nur geglaubt, es sei möglich, wenn (a && b < c)... :-)

Jetzt weiß ich es, danke!

 
MarkTrade:


Nein, ich habe den Unterschied bemerkt. Ich habe nur geglaubt, es sei möglich, wenn (a && b < c)... :-)

Jetzt weiß ich Bescheid, danke!

Vielleicht meinten Sie if(a+b < c) ? Dann können Sie das auch so machen!
 
skyjet:


Nochmals vielen Dank! Jetzt habe ich versucht, die Anzahl der "überprüfbaren" Balken zu optimieren, aber die Ergebnisse im Fenster sind einfach nicht da. Ich habe versucht, sowohl am Anfang als auch am Ende mit dem Zählen zu beginnen, aber vergeblich.

extern int number=3;
//------------------------------------+
for (int x=number; x>1; x--) // x>1 (а не x>=1)
{
if(Open[x]==Open[x-1]) continue;
if(Open[x]<Open[x-1])
   {
    //--- action 1
   }
else
   {
    //--- action 2
   }
}

Was meinen Sie mit "...keine Ergebnisse in dem Fenster"? Vielleicht werden die Ergebnisse im Fenster nicht korrekt angezeigt und es liegt ein Fehler an anderer Stelle im Programm vor?

 

Liebe Kolleginnen und Kollegen! Bitte teilen Sie mir mit, ob es Literatur (Lehrbücher) zur Programmierung von Linien auf der Grundlage der technischen Analyse, einschließlich Fibo-Levels, gibt. Es ist wünschenswert, mit Beispielen von Programmcode "für Dummies".

Oder wer kann einen ähnlichen Berater mit offenem Quellcode vorschlagen.

Ich bin Ihnen im Voraus dankbar.

 
alexey1979621:

Liebe Genossinnen und Genossen! Bitte teilen Sie mir mit, ob es Literatur (Lehrbücher) zur Programmierung von Linien auf der Grundlage der technischen Analyse, einschließlich Fibo-Levels, gibt. Vorzugsweise mit Codebeispielen "für Dummies".

Ich weiß nicht, wie man es benutzt.

Ich bin sehr dankbar.

Was ist an diesem Lehrbuch falsch? Was auch immer Sie brauchen, lernen, üben, viel Glück!
 
artmedia70:
Verstehen und sehen Sie, was in Ihrem Array enthalten ist, unmittelbar nachdem es mit Auftragsdaten "gefüllt" wurde? Nein. Sie wissen es nicht, Sie vermuten es nur. SPRINT den Inhalt aller Array-Zellen, nicht mit Ihrem pr(), sondern mit dem Standard Print() und versuchen Sie, in das Testerprotokoll zu schauen und zu sehen, was Sie in dem Array haben, in jeder Zelle, direkt nachdem es gefüllt ist. Wenn Sie sicher sind, dass der Inhalt des Arrays mit Ihren Vorstellungen übereinstimmt, drucken Sie ihn mit Ihrem pr() aus. Wenn Sie nicht die gleichen Ergebnisse erhalten, liegt es an Ihrem pr(), wenn die Daten übereinstimmen, suchen Sie im nächsten Schritt nach einem Fehler.

Arrays sind gedruckt worden, aber im Moment geht es nicht um sie. Ich werde im Folgenden beschreiben, was ich denke.

Im Übrigen. Alle Ausgaben wurden auf einen Standarddruck umgestellt. Die Situation ist dieselbe. Es erscheint der Moment, in dem 4 Positionen in + geschlossen werden. Und dann sollte logischerweise die Funktion isCloseByTakeLastOpenPos() funktionieren, die ich von Anfang an wie folgt aufrufe:

 for (int ord=OrdersTotal()-1; ord>=0; ord--)
   {
      if (!OrderSelect(ord,SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() == 6) continue;
        
      g_ticket = OrderTicket();
      g_type = OrderType();
              
      // Блок модификации ордеров       
      if (i_sl != 0 || i_tp != 0)
      {
         if (OrderStopLoss() == 0 && OrderTakeProfit() == 0)
         {
            OrdersModifyer(g_ticket);
         }
      }
      // Закрытие всех ордеров, если последний ордер закрыт
      if (isCloseByTakeLastOpenPos(2))        // Наша функция, определяющая.. закрылся ли последний закрытый ордер в + или нет.
      {
         // if (g_type < 2)
          {
              ClosePosBySortLots();
          }
          //else
          if (g_type > 1 && g_type < 6)
          {
              DeletePendingOrders(g_ticket);
          }
      }
   }

die uns sagt, dass der letzte geschlossene Auftrag entweder mit Gewinn oder mit Verlust geschlossen wurde. Hier ist die Funktion:

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
bool isCloseByTakeLastOpenPos(int delta)
{
   datetime lastOrderCloseTime = -1,               // Время закрытия последнего открытого ордера
            lastOOTHist = -1;                     // Время открытия последнего открытого ордера из истории
   int j = -1;
   Print ("isCloseByTakeLastOpenPos: вошли в функцию");
   
   for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() > 1) continue;               // Все удалённые отложки нас не интересуют..
      Print ("isCloseByTakeLastOpenPos: первоначальные условия выполнены!");

      if (lastOrderCloseTime < OrderCloseTime())   // Находим время закрытия..
      {
         lastOrderCloseTime = OrderCloseTime();   // ..последней закрытой позиции в истории
         j = i;
         Print ("j = " + j + "   " + TimeToStr(TimeCurrent()));
      }
   }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY))
   {
      if (OrderProfit() + OrderCommission() + OrderSwap() <= 0) return (false);
//      pr ("OTP() = " + OrderTakeProfit() + "; OCP() " + OrderClosePrice() + "   " + TimeToStr(TimeCurrent()));
  //    pr ("OOP() = " + OrderOpenPrice() + "; OCP() " + OrderClosePrice() + "   " + TimeToStr(TimeCurrent()));
      if (MathAbs(OrderTakeProfit() - OrderClosePrice()) > delta * pt) return (false);
      else
      {
         lastOOTHist = OrderOpenTime();
         Comment("\n", "FUNC isCloseByTakeLastOpenPos: ",
                 "\n", "j = ", j,
                 "\n", "lastOOTHist = ", TimeToStr(lastOOTHist, TIME_SECONDS));
      }
   }
   else
   {
      Comment("\n", "FUNC isCloseByTakeLastOpenPos: ",
              "\n", "j = ", j,
              "\n", "не удалось выбрать ордер в истории");
      return(false);
   }
  
   for(int h=OrdersTotal()-1; h>=0; h--)
   {
      if (OrderSelect(h, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderMagicNumber() != i_magic)   continue;
         if (OrderSymbol() != Symbol())       continue;
         if (OrderType() > 1)                 continue;
         if (lastOOTHist < OrderOpenTime()) return(false);  // Выбранная рыночная позиция открыта позже закрытой по тейку
      }
      else {Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер");return(false);}
   }
   Print ("isCloseByTakeLastOpenPos: последняя закрытая позиция профитна!");
   
   return (true);
}

Die Situation ist interessant. Alles funktioniert. Und hier zeigt sich die Situation:

Wir können sehen, dass 4 Positionen mit Gewinnmitnahme geschlossen wurden. Sie wurden von Takei geschlossen. D.h. die Funktionen, die die Aufträge abschlossen, funktionierten überhaupt nicht. Der Grund dafür scheint zu sein, dass die Abschlussbedingung nicht funktioniert hat. Das ist es:

 if (isCloseByTakeLastOpenPos(2))

Wenn wir uns diese Funktion ansehen und alles ausdrucken, wird klar, dass sie in diesem Moment nicht wahr geworden ist. Wie das? Schließlich wurden die äußersten 4 Aufträge in + abgeschlossen. Ich habe den Code der Funktion oben angegeben. Hier ist der Inhalt des Protokolls zum gleichen Zeitpunkt:

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:04 2013.08.15 12:30 Tester: take profit #104 at 1.32731 (1.32722 / 1.32724)

2013.09.09 00:13:04 2013.08.15 12:30 Tester: take profit #102 at 1.32731 (1.32722 / 1.32724)

2013.09.09 00:13:04 2013.08.15 12:30 Tester: take profit #100 at 1.32731 (1.32722 / 1.32724)

2013.09.09 00:13:04 2013.08.15 12:30 Tester: take profit #98 at 1.32731 (1.32722 / 1.32724)

2013.09.09 00:13:03 2013.08.15 12:30 Tester: order #104, sell 0.93 EURUSD.GI is opened at 1.32831

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: j = 74 2013.08.15 12:30

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: вошли в функцию

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!


Wir können sehen, dass die Bedingung nicht funktioniert hat. Was ist hier falsch?

 
Können Sie mir sagen, ob es einen Indikator gibt, der den Spread auf dem gesamten Chart erkennt, oder ob es möglich ist, dies zu tun? Ich habe nur einen Indikator gefunden, der die Spanne beim Einschalten des Terminals ab dem Moment des Anschließens erfasst.
 
paladin80:

Was meinen Sie mit "...das Ergebnisfenster ist einfach leer". Vielleicht werden die Ergebnisse im Fenster nicht korrekt angezeigt und es liegt ein Fehler an anderer Stelle im Programm vor?


Ich vergleiche aber 3, 2 und 1 Balken, d.h. die Berechnung wird durch x >=1 behindert?

Und bedeutet es, dass Barren mit demselben Preis einfach nicht berücksichtigt werden, ihnen keine Nummern zugeordnet werden?

Durch die Einstellung der Optimierungsparameter: Start 1, Schritt 1, Ende 4; auf H1 und H4 ist die Ergebnisregisterkarte einfach leer, auf D1 wird die gleiche Rentabilität mit einer anderen Anzahl von Balken analysiert.

if(Open[x]==Open[x-1]) continue;
 

Fachleute können ohne Sie nirgendwo hingehen.

Hilfe zur Funktion. Damit wird die letzte Anzahl von Verlustaufträgen in der Historie zu einem Plusauftrag gezählt.

D.h. die Historie zeigt 3 letzte Aufträge im Minus, dann 1 im Plus und 2 im Minus.

Diese Funktion sollte die letzten drei (vor der positiven Reihenfolge) zählen