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

 
nick_travel:

Guten Tag!

Bitte helfen Sie mir und erklären Sie mir, warum der Expert Advisor nicht funktioniert oder nicht handelt?

Vielleicht will er essen? Oder auf einen Gehaltsscheck warten...
 
hoz:


Ja, diese Regelung ist übrigens intelligenter in der Umsetzung. Die zugehörige Funktion am Anfang nimmt nun mehr Platz ein. Das Ergebnis sah folgendermaßen aus:

Es gibt doch nichts zu optimieren, oder?

Ich meine, dass es viel bequemer ist, wenn es am Anfang gar nicht viel gibt. Und alles wird rein über Funktionen aufgerufen. Und beim letzten Mal stellte sich heraus, dass der Start alle möglichen Verschachtelungen von Hauptfunktionen und Überladungen von zusätzlichen Funktionen aufweist...

Und warum sollte man ein Array per Referenz übergeben, wenn man einen global deklarierten Array-Namen in einer Funktion verwendet? Vielleicht sollten Sie es so machen:

void FindOrders(int &massive[])
{
   int oType;
   ArrayInitialize(massive, 0);
   for (int i=OrdersTotal() - 1; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      
      oType = OrderType();
      massive[oType] = massive[oType] + 1;
   }
}

Und Sie können es ein wenig reduzieren:

void FindOrders(int &massive[])
{
   ArrayInitialize(massive, 0);
   for (int i=OrdersTotal() - 1; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      
      massive[OrderType()] = massive[OrderType()] + 1;
   }
}

Und was ist mit dem Aufruf von Start und der Anzeige von Nachrichten? Ich habe den Eindruck, dass sie etwas durcheinander gebracht haben. Wir können die Funktion pr() nicht sehen, also können wir nichts vorschlagen.

Ich habe die Anzahl der Aufträge im Testgerät mit einem schnellen Algorithmus überprüft:

   FindOrders(mn0, OrdersMassive);

   Comment ("\n"+"Всего ордеров = "+OrdersTotal()+
            "\n"+"Количество "+GetNameOP(0)+" = "+OrdersMassive[0]+
            "\n"+"Количество "+GetNameOP(1)+" = "+OrdersMassive[1]+
            "\n"+"Количество "+GetNameOP(2)+" = "+OrdersMassive[2]+
            "\n"+"Количество "+GetNameOP(3)+" = "+OrdersMassive[3]+
            "\n"+"Количество "+GetNameOP(4)+" = "+OrdersMassive[4]+
            "\n"+"Количество "+GetNameOP(5)+" = "+OrdersMassive[5]
            );

Sie können die gesamte Ausgabe in eine Funktion verpacken, die Daten aus dem Array liest und die Informationen auf eine menschliche Art und Weise anzeigt.

 
nick_travel:

Guten Tag!

Bitte helfen Sie und erklären, warum der EA nicht funktioniert oder Trades?


Denn hier. nicht alle Telepathen und nicht alle und Visionäre!
 

Ich verstehe!

Ich meine, gibt es eine Einstellung oder etwas anderes, das Sie brauchen?

 
artmedia70:

Warum ein Array per Referenz übergeben, wenn Sie einen global deklarierten Array-Namen in der Funktion verwenden? Vielleicht sollte es so sein:

void FindOrders(int &massive[])
{
   int oType;
   ArrayInitialize(massive, 0);
   for (int i=OrdersTotal() - 1; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      
      oType = OrderType();
      massive[oType] = massive[oType] + 1;
   }
}

Ja, das ist tatsächlich sinnvoll. Aber auch hier übergeben Sie es per Referenz:)) Ich hatte es nach dem letzten Mal, als Parameter nicht global deklariert wurden.

Und über die pr-Funktion. Hier ist sie:

//+-------------------------------------------------------------------------------------+
//| Распринтовка на экран                                                               |
//+-------------------------------------------------------------------------------------+
void pr (string txt)
{
   string info [];
   ArrayResize(info, 20);
   string h, m, s, cm; int i;
   
   h = DoubleToStr(Hour(), 0);    if (StringLen(h) < 2) h = "0" + h;
   m = DoubleToStr(Minute(), 0);  if (StringLen(m) < 2) m = "0" + m;
   s = DoubleToStr(Seconds(), 0); if (StringLen(s) < 2) s = "0" + s;
   txt = h + ":" + m + ":" + s + " - " + txt;
   
   for (i=20-1; i>=1; i--)
   info[i] = info[i-1];
   info[0] = txt;
   
   for (i=20-1; i>=0; i--)
   if (info[i] != "")
   {
      cm = info[i];
      ObjectCreate ("txtw"+i, OBJ_LABEL, 0, 0, 0);
      ObjectSet    ("txtw"+i, OBJPROP_CORNER, 1);
      ObjectSet    ("txtw"+i, OBJPROP_XDISTANCE, 10);
      ObjectSet    ("txtw"+i, OBJPROP_YDISTANCE, 30+15*i);
      ObjectSetText("txtw"+i, cm, 10, "Times New Roman", Green);
   }
}
 
nick_travel:

Ich verstehe!

Ich meine, gibt es eine Einstellung oder etwas anderes, das Sie brauchen?


Ich meine, ich glaube nicht, dass es hier irgendwelche Telepathen gibt, und selbst wenn, versuchen Sie einfach, sie für so ein Kunststück zu interessieren... Raten und helfen...

 
hoz:


Ich meine, es gibt hier kaum Telepathen, und selbst wenn, solltest du versuchen, sie für solche Kunststücke zu begeistern... Raten und helfen...

Und vielleicht ein sehr gutes System, das den falschen Einstieg in den Markt nicht zulässt! Ich wünschte, ich hätte eine!
 

Ich habe einen anhaltenden Stillstand bei der Schließung von benötigten Positionen. Die Quintessenz ist folgende:

1. Die Schließung von Positionen wird verfolgt.

2. Sobald die letzte Position auf dem Takeaway geschlossen wurde... ...sollten alle offenen und schwebenden Positionen sofort geschlossen werden. Alles wird nach Losen sortiert geschlossen, d.h. große Lose auf einmal, dann kleinere. Dies ist nur dazu gedacht, Erfahrungen mit Aufträgen zu sammeln.

Die Umsetzung erfolgt wie folgt:

In start() bei jedem Tick:

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

Wir sind an der Schließung von Marktaufträgen interessiert, da die anhängigen Aufträge bei Bedarf gelöscht werden. Hier ist, was wir haben:

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
bool isCloseByTakeLastOpenPos(int delta)
{
   datetime lastOrderCloseTime = -1,               // Время закрытия последнего открытого ордера
            lastOOTHist = -1;                     // Время открытия последнего открытого ордера из истории
   int j = -1;
   pr ("Запустилась функция 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;               // Все удалённые отложки нас не интересуют..
  
      if (lastOrderCloseTime < OrderCloseTime())   // Находим время закрытия..
      {
         lastOrderCloseTime = OrderCloseTime();   // ..последней закрытой позиции в истории
         j = i;
         pr ("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);}
   }
   
   return (true);
}

//+-------------------------------------------------------------------------------------+
//| Закрытие ордеров, отсортированных по размеру лотов                                  |
//+-------------------------------------------------------------------------------------+
void ClosePosBySortLots()
{
   double a[][2];
   int p = 0;
   
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() < 2)
      {
         p++;
         ArrayResize(a, p);
         a[p-1][0] = OrderLots();
         a[p-1][1] = OrderTicket();
      }
   }
   pr ("ClosePosBySortLots(): " + "p = " + p);
   if (p > 0)
   {
      ArraySort(a, WHOLE_ARRAY, 0, MODE_DESCEND);
      for(i=0; i<p; i++)
      {
         if (OrderSelect(a[i][1], SELECT_BY_TICKET, MODE_TRADES))
         {
             if (OrderCloseTime() == 0) ClosePosBySelect();
         }
      }
   }
}
//+-------------------------------------------------------------------------------------+
//| Закрытие одного, предварительно выбранного ордера                                   |
//+-------------------------------------------------------------------------------------+
void ClosePosBySelect()
{
   bool   fc;
   color  clClose, clCloseBuy = Blue, clCloseSell = Red;
   double ll, pa, pb, pp;
   int    err, it, NumberOfTry = 3;

   if (OrderType() == OP_BUY || OrderType() == OP_SELL)
   {
       for (it=1; it<=NumberOfTry; it++)
       {
           while (!IsTradeAllowed()) Sleep(5000);
           RefreshRates();
           pa = MarketInfo(OrderSymbol(), MODE_ASK);
           pb = MarketInfo(OrderSymbol(), MODE_BID);
           if (OrderType() == OP_BUY)
           {
               pp = pb; clClose = clCloseBuy;
           }
           else
           {
               pp = pa; clClose = clCloseSell;
           }
           ll = OrderLots();
           fc = OrderClose(OrderTicket(), ll, pp, 30, clClose);
           if (fc)
           {
              break;
           }
           else
           {
               err = GetLastError();
           }
       }
   }
   else Print("Некорректная торговая операция. Close ");
}

Aus irgendeinem Grund werden einige der Aufträge nicht abgeschlossen. Ich drucke einige Segmente aus, wenn ich sie sehe, verstehe ich nichts. Hier ist ein Beispiel:

Der Kommentar zeigt an, dass lastOOTHist = 01:30:00 ist, obwohl dies eigentlich nicht korrekt ist. Wenn wir lastOOTHist im Ergebnisfenster überprüfen, werden wir sehen, dass

ihre Schließzeiten sind unterschiedlich...

Was ist hier falsch?

 
hoz:

Ja, das ist tatsächlich sinnvoll. Sie haben auch einen Link hier...:)) Das hatte ich noch vom letzten Mal übrig, als die Parameter nicht global waren.

Ich habe argumentiert, dass das Array hier per Referenz übergeben werden muss. Andernfalls ist die Funktion dazu verdammt, nur mit einem einzigen, fest kodierten Array zu arbeiten. Auch wenn Sie es global definiert haben.
 

Es tut mir leid, dass ich am Ende der Woche gebraucht werde, aber ich werde fragen.

Hat jemand Erfahrung mit dem Lesen einer Nachricht in einer Mailbox von einem bekannten Absender?