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

 
Sepulca:

Ich hätte es so gemacht:


P.S. Gleichzeitig geantwortet)))

Das verstehe ich nicht:

if(shift>0) shift=shift-1;

wenn am ersten Balken geöffnet, von Null auf Null?

 
artmedia70:

Das verstehe ich nicht:

Wenn der erste Balken geöffnet ist, sehen wir dann von Null auf Null?


Dies ist eine kleine Beruhigung für den Fall, dass der Eröffnungskurs der Order zum Zeitpunkt der Eröffnung bereits viel höher als Low ist. D.h., wir verwenden die Öffnungsleiste nicht für die Suche. Dafür ist PERIOD_M1 gedacht.
 
Sepulca:
Dies ist eine kleine Absicherung für den Fall, dass der Eröffnungskurs des Auftrags zum Zeitpunkt der Eröffnung bereits viel höher ist als das Tief. D.h. wir verwenden die Öffnungsleiste nicht für die Suche. Dafür ist PERIOD_M1 gedacht.

Ich würde es auf eine andere Weise machen. Im Allgemeinen würde ich erst dann mit der Suche beginnen, wenn die Position länger als einen Balken gedauert hat. Schließlich kann der beste Preis direkt auf der Eröffnungsleiste liegen, und wir werden ihn vergeuden.
 
artmedia70:
Ich würde es anders machen. Im Allgemeinen würde ich erst dann mit der Suche beginnen, wenn die Position länger als einen Takt gedauert hat. Schließlich kann der beste Preis gerade in der Eröffnungsphase sein, und wir werden ihn vergeuden...

Ich stimme zu. Es wäre wahrscheinlich effizienter, sich den Mindest- (oder Höchst-) Preis für jeden offenen Auftrag im Array bei jedem Tick zu merken und die Aufträge zu schließen, wenn die Bedingung erreicht ist, als das Minimum ab dem Zeitpunkt der Auftragseröffnung sozusagen neu zu suchen:

 ShortOrderTicket[i]=OrderSend(Symbol(),OP_SELL,......
 if(ShortOrderTicket[i]>=0) min[i]=Bid;
 //.....................................................
 //На каждом тике обновляем минимумы для каждого открытого ордера
 for(i=0;i<N;i++){
  if(ShortOrderTicket[i]>=0){
   min[i]=MathMin(min[i],Ask);
  }
// Если достигнуто условие, закрываем ордер
  if(Ask>min[i]+Delta) if(OrderClose(ShortOrderTicket[i],.....))ShortOrderTicket[i]=-1;
 }
Und im Falle von Problemen wie Verbindungsverlust, Neustart des Advisors usw. sollten wir von Zeit zu Zeit den Stoploss bei Aufträgen ändern.
 
artmedia70:
Ich habe argumentiert, dass das Array hier per Referenz übergeben werden muss. Andernfalls muss die Funktion mit nur einem streng definierten Array arbeiten. Auch wenn Sie es global definiert haben.


Hm. Es hängt davon ab, welches Array an die aufrufende Funktion übergeben wird. Wenn es sich um ein bestimmtes Array handelt, wird die aufgerufene Funktion damit arbeiten... Denn das ist...

Wenn, zum Beispiel,

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

Indem wir es auf diese Weise aufrufen:

FindOrders(OrdersMassive)

Es funktioniert mit dem Array OrdersMassive.

Und so:

FindOrders(massiveOfOrders)

Mit dem Array massiveOfOrders.

 
Können Sie mir sagen, wie ich den Spread zum Zeitpunkt der Eröffnung eines Geschäfts herausfinden kann, oder besser noch, wie ich ihn im Protokoll anzeigen lassen kann?
 
Forexman77:
Können Sie mir sagen, wie ich die Größe des Spreads zum Zeitpunkt der Eröffnung eines Geschäfts herausfinden kann, oder besser noch, wie ich sie im Protokoll anzeigen kann?

Wenn (spread) == irgendein Wert, dann... etwas tun... (Zum Beispiel einen Auftrag öffnen oder seinen Wert im Journal ausdrucken). Oder umgekehrt, wenn er nicht gleich oder größer (kleiner) als ein bestimmter Wert ist, dann zeigen wir ihn im Journal an und tun etwas. Sie können tun, was Sie wollen.
 

Ich wiederhole die Frage, die ich gestern gestellt habe. Ich möchte sie nicht in einem separaten Thread veröffentlichen. Sollte etwas unklar sein, werde ich alle Fragen beantworten.

Ich habe immer noch Schwierigkeiten, die erforderlichen Positionen zu schließen. Die Situation stellt sich wie folgt dar:

1. die Schließung von Positionen wird verfolgt.

2. Sobald die letzte Position an der Take Line 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:

Im Kommentar ist zu sehen, dass lastOOTHist = 01:30:00 ist, obwohl dies eigentlich nicht stimmt. Wenn wir lastOOTHist im Ergebnisfenster überprüfen, werden wir sehen, dass

ihre Schließzeiten sind unterschiedlich...

Was ist hier falsch?

 
hoz:


Hm. Es hängt davon ab, welches Array an die aufrufende Funktion übergeben wird. Wenn es sich um ein bestimmtes Array handelt, wird die aufgerufene Funktion damit arbeiten... Denn das ist...

Wenn, zum Beispiel,

Indem wir es auf diese Weise aufrufen:

Es funktioniert mit dem Array OrdersMassive.

Und so:

Mit Array massiveOfOrders.


Wenn Sie eine Variable (Array) als Wert an eine Funktion übergeben, wird eine lokale Variable innerhalb der Funktion erstellt, die Sie im Header deklarieren: myFunct(int my_var). Auf diese Weise sind Änderungen dieser Variablen außerhalb der Funktion nicht zu sehen. Und im Falle eines Arrays wird der Compiler Sie daran erinnern.

Wenn Sie möchten, dass die Änderungen des Variablenwerts außerhalb der Funktion sichtbar sind, übergeben Sie die Variablen per Referenz: myFunct(int & my_var)

 
hoz:


Es hängt davon ab, welches Array an die aufrufende Funktion übergeben wird. Wenn es ein bestimmtes Array gibt, dann wird die aufgerufene Funktion damit arbeiten... Es ist folgendermaßen...

Wenn, zum Beispiel,

Indem wir es so nennen:

Es funktioniert mit dem Array OrdersMassive

Und hier entlang:

Mit Array massiveOfOrders

Ganz genau. Das ist, was ich sage - warum sollten Sie wollen, dass ein bestimmtes Array in der Funktion selbst hart kodiert wird, wenn Sie jedes Array der gleichen Größe und des gleichen Typs übergeben können.