[ARCHIV] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 3. - Seite 303

 
costy_:

Es gibt viele Möglichkeiten, z.B. die Aufzeichnung der offenen Zeiten in einer Datei, aber es ist einfacher, durch die offenen Aufträge zu blättern und die Laufzeiten zu vergleichen.

.

.

"Es ist notwendig, alle offenen Positionen nach einem bestimmten Zeitintervall

zu schließen" für jede einzelne Position (so habe ich die Frage verstanden). Danke! Das Wort "einfacher" in Ihrer Antwort ist das Schlüsselwort, es bedeutet, dass eine solche Funktion nicht eingebaut ist. Ich wollte nur jede einzelne Position 2 Stunden nach ihrer Eröffnung schließen .
 
costy_:

Da das Skript die Zeit des Testers nicht so leicht findet (aber der Indikator schon), können Sie den Testberater an den Start bringen

schnell und zuverlässig ...

Ich danke Ihnen. Im Skript wurde das so gemacht:
    datetime time_start=GlobalVariableGet( "Time_test");
//    Alert(iBarShift(NULL,0,time_start)); 
    EndBar =  iBarShift(NULL,0,time_start);
Alles funktioniert.
 

Ich versuche, einen Inikator zu schreiben. Ich verstehe nicht, warum es neu gezeichnet wird. Außerdem wird nur das Rendering herangezogen. Bitte helfen Sie mir. Ich bin neu im Programmieren.

#property indicator_chart_window
#Eigenschaft indicator_buffers 2
#property indicator_color1 Magenta
#Eigenschaft indicator_color2 Rot
//---- Eingabeparameter
extern int N;
datetime some_time=D'1971.01.11 00:00';
datetime some_time_1=D'1971.01.11 00:00';
//---- Puffer
double RLB_Buffer[];
double RLB_Buffer_1[];
double Real_Line_Balanse=0,x=0,last_high,last_low,RLB, Real_Line_Balanse_1=0,x1=0,last_high_1,last_low_1,RLB_1;
bool dirlong,first;
int i,ii,bar_high,bar_low,first_t_bar,now_bar,first_t_bar_1,now_bar_1;
//+------------------------------------------------------------------+
//| Benutzerdefinierte Initialisierungsfunktion für Indikatoren |
//+------------------------------------------------------------------+
int init()
{
string kurz_name;
//---- Indikatorzeile
SetIndexStyle(0, DRAW_ARROW);
SetIndexPfeil(0, 159);
SetIndexBuffer(0,RLB_Buffer);
//----;
SetIndexStyle(1, DRAW_ARROW);
SetIndexPfeil(1,159);
SetIndexPuffer(1,RLB_Puffer_1);
zurück(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
Kommentar(i," ",ii);
//----
if(Balken < 3)
zurück(0);
//----------
first_t_bar=iBarShift(NULL,0,some_time,false); //Balken tendieren nach oben
now_bar=iBarShift(NULL,0,TimeCurrent(),false); //letzter Balken, ganz rechts
i=gezählte_Balken-erster_t_Balken+1;
//------------
first_t_bar_1=iBarShift(NULL,0,some_time_1,false); //Trendstartbalken
now_bar_1=iBarShift(NULL,0,TimeCurrent(),false); //letzter Balken, ganz rechts
ii=gezählte_Balken-erster_t_Balken_1+1;
// if(IsVisualMode()==TRUE) i=erster_t_balken-gezählte_balken-1; //if(gezählte_balken), dann Trendstartbalken
if(gezählte_Balken == 0)
{
first = false;
i=erster_t_bar+1;
ii=erster_t_bar_1+1;
}
//------------ //gezählte Minusbalken
dirlong = false;
if(iMA(NULL,0,1,0,MODE_SMA,PRICE_MEDIAN,0)>iMA(NULL,0,2,0,MODE_SMA,PRICE_MEDIAN,0))dirlong = true;
if(dirlong == true) //wenn der Trend nach oben geht
{
while(i>=0)
{
x++; //Anzahl der Balken ab Trendbeginn
Real_Line_Balanse=Close[i+5]; //Zahl der Summe der Slows aus dem Trend
RLB=Real_Line_Balanse;
if(RLB<Low[1]) RLB_Buffer[i]=Real_Line_Balanse; //Zeigt die Linie nur an, wenn der Kurs gestiegen ist
//-------
if(RLB>Close[i]&& x>50) //wenn der Kurs die RLB von oben nach unten überschritten hat
{
bar_high=iHighest(NULL,0,MODE_HIGH,first_t_bar,now_bar);//dann HIGH ermitteln zwischen
//letzter Balken und Beginn des Trends
some_time_1=Time[bar_high]; //neuer Beginn des Abwärtstrends
x=0; //Nullstellung des Taktzählers ab Trendbeginn
Real_Line_Balanse=0;
}
i--;
}//while
//-------
}//dirlong
//---------------------
//---------------------
if(dirlong == false) //wenn Abwärtstrend
{
while(ii>=0)
{
x1++; //Anzahl der Balken ab Trendbeginn
Real_Line_Balanse_1=Close[ii+10]; //zählt die Anzahl der Balken des Trends
RLB_1=Real_Line_Balanse_1;
if(RLB_1>High[1]) RLB_Buffer_1[ii]=Real_Line_Balanse_1;
//-------
if(RLB_1<Close[ii]&& x1>50) //wenn der Kurs die RLB von oben nach unten überschritten hat
{
bar_low=iLowest(NULL,0,MODE_LOW,first_t_bar_1,now_bar_1);//dann Bestimmung des LOW zwischen
//letzter Balken und Beginn des Trends
some_time=Time[bar_low]; //neuer Beginn des Trends nach oben
x1=0; //Nullstellung des Taktzählers ab Trendbeginn
Real_Line_Balanse_1=0;
}
ii--;
} //while
//-------
}//dirlong
//---------------------
zurück(0);
}
//+------------------------------------------------------------------+

 

Das ist Unsinn. Anstelle von

i=gezählte_Balken-erster_t_Balken+1;

Ich habe einen Entwurf erstellt, der die Balken zählt, die er selbst zählt. ALLES begann reibungslos zu laufen. IndicatorCounted(); glitches oder ich kapiere es nicht...

 

Wie kann man eine Variable über den Status eines abgeschlossenen Auftrags informieren?


Avatar
2
vitaluxa 29.10.2011 21:26
Hallo!

Wie informiere ich die Variable darüber, dass ein EA eine Order geöffnet hat und diese bei Stop Loss oder Take Profit geschlossen wurde?
Vielen Dank im Voraus!
 
001:

Das ist Unsinn. Anstelle von

i=gezählte_Balken-erster_t_Balken+1;

Ich habe ein Konstrukt eingebaut, das die gezählten Balken selbst zählt. ALLES geht gut. IndicatorCounted(); glitches oder ich kapiere es nicht...

Sie verwenden while(i>=0), d.h. wenn eine neue Kerze erscheint, ist i=1 (um sicherzustellen, dass die Daten der vorherigen Kerze einmal zu den aufgezeichneten Daten gezählt werden).

Warum geben Sie some_time=D'1971.01.11 00:00'; verwenden Bars , IndicatorCounted funktioniert nicht für mich (gut, der Fehler ist wahrscheinlich wegen der ersten_t_bar).

Ihr Algorithmus und Sie sollten ihn korrigieren.

"Ich bin neu im Programmieren."Seit 2007).

 
sergeev:

Wie kann man eine Variable über den Status eines abgeschlossenen Auftrags informieren?


:)

+ ...

Für Vitaluha:

https://docs.mql4.com/ru/trading/OrderStopLoss

https://docs.mql4.com/ru/trading/OrderTakeProfit

 
Guten Tag, könnten Sie mir bitte sagen, warum die Angebote vom 10. Juni bis 22. September dieses Jahres nicht hochgeladen werden können? Ich habe zwei bis drei Verlaufs-Uploads durchgeführt, und bei allen war die gleiche Lücke in den Daten vorhanden.
 
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж Закрвает открытые позиции через 2 суток
void DelOldPositions()                                    
{   
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--)
    {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
        {
         if (OrderOpenTime()+2*24*60*60  > TimeCurrent())  
          {
           OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,4 ),3,Red);
          }
        }
   }
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
Помогите поправить 2 последние строки, т.к. в тестере почему-то  мгновенно  закрывает все открытые позы. С уважением.
 

Das Problem ist, dass der EA ständig Aufträge neu eröffnet, d.h. es gibt ein Kaufsignal - er öffnet einen Auftrag, schließt ihn dann mit Gewinn, und wenn die Bedingungen noch erhalten sind, öffnet er ihn wieder.

Ich dachte, dies könnte mit dem traditionellen Kauf- und Verkaufszähler gehandhabt werden - wenn ein Kaufauftrag eröffnet wurde, beträgt der Zähler +1 und ein neuer Kauf kann erst eröffnet werden, wenn der Zähler über 0 steigt, und der Zähler wird nach einem Verkauf auf Null gesetzt.

extern double TakeProfit = 150;
extern double Sl = 150;
extern double Lots = 0.1;
extern int n = 9;     
        
//-----------------------------------------------------------

int start()
 {
  int cnt, ticket, total, i, Buy=0, Sell=0;
  double x1=iIchimoku(NULL,0,9,26,52,MODE_TENKANSEN,0);   //красная
  double x2=iIchimoku(NULL,0,9,26,52,MODE_KIJUNSEN,0);    //синяя
  double x3=iIchimoku(NULL,0,9,26,52,MODE_SENKOUSPANA,0); //фиол пунктир
  double x4=iIchimoku(NULL,0,9,26,52,MODE_SENKOUSPANB,0);  //кр пунктир
  double x5=iIchimoku(NULL,0,9,26,52,MODE_CHINKOUSPAN,0);  //зеленая
  double x6=Ask;
  double x61=Bid;
  double Lot=0;  
  total=OrdersTotal();
  
  for (i=total-1;i>=0;i--)   //счетчик выставленных ордеров
   { 
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
       {
         if(OrderType()==OP_BUY)
          { 
           Buy++;
            }  
          if (OrderType()==OP_SELL)
           { 
            Sell++;
             }  
        }
     }
  if(total<1)//проверка количества ордеров 
   {
    
         if(AccountFreeMargin()<(100*Lots))
              {
     Print("Недостаточно средств = ", AccountFreeMargin());
     return(0);  
               }

         if (x6>x3 && x6>x4 && x1>x2 && x6>x2 && x6<(x2+60) && Buy==0) //бай
               {
                   ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-Sl*Point,Ask+TakeProfit*Point,0,0,0,Green); Sell=0; // ордер и обнуление счетчика
                      if(ticket>0)
                      {
                         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("открыта позиция BUY : ",OrderOpenPrice());
      
                         else Print("Ошибка при открытии BUY позиции : ",GetLastError()); 
                        }
              }
   
         if (x6<x3 && x6<x4 && x1<x2 && x6<x2 && x6>(x2-60) && Sell==0) //селл 
                {
                   ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+Sl*Point,Bid-TakeProfit*Point,0,0,0,Red); Buy=0; //сам по себе ордер и обнуление счетчика 
                     if(ticket>0)
                     {
                         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("открыта позиция SELL : ",OrderOpenPrice());
    
                         else Print("Ошибка при открытии SELL позиции : ",GetLastError());
      
                      } 
    
                  }
  
  
  } 

   if((OrderType()==0 && x61<x3 && x61<x4 && x1>x2 && x1>x3 && x1>x4) || (OrderType()==1 && x61>x3 && x61>x4 && x1<x2 && x1<x3 && x1<x4)) //закрытиеи на развороте
      {
          bool   result;
          double price;
          int    cmd,error;
//----
          if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
              {
                  cmd=OrderType();
                  if(cmd==OP_BUY || cmd==OP_SELL)
                    {
                      while(true)
                        {
                         if(cmd==OP_BUY) price=Bid;
                         else            price=Ask;
                         result=OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
                         if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
                         else error=0;
                         if(error==135) RefreshRates();
                         else break;
                        }
                     }
               }
          else Print( "Error when order select ", GetLastError());
//----
          
      }
 
 }
 
 
Dateien:
Grund der Beschwerde: