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

 
hoz:



 double lastOrderCloseTime = -1,                   // Время закрытия последнего ордера
        lastOrderOpenTime = -1;                     // Время открытия последнего ордера
Was ist das?

Typ, int oder datetime
 
artmedia70:
Ich habe einmal eine Funktion erstellt, die Meldungen in ein leeres Anzeigefenster ausgibt. Sie können die Farben der angezeigten Linien anpassen. Sie ist bereits fehlerfrei. Wenn Sie sie brauchen, kann ich sie weitergeben.


Ich werde mir Ihren Code gerne ansehen, Artem. Für Testdrucke ist das nicht die bequemste Option...
 

r772ra:

 double lastOrderCloseTime = -1,                   // Время закрытия последнего ордера
        lastOrderOpenTime = -1;                     // Время открытия последнего ордера

Was ist das?


Typ, int oder datetime

Ich habe das ganze Chaos umgeschrieben, und das Ergebnis sieht so aus:

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
datetime GetLastOrderState()
{
   datetime lastOrderCloseTime = -1,                   // Время закрытия последнего ордера
            lastOrderOpenTime = -1;                     // Время открытия последнего ордера
   
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
  
      if (lastOrderOpenTime < OrderOpenTime())
      {
          lastOrderOpenTime = OrderOpenTime();
          lastOrderCloseTime = OrderCloseTime();
      }
   }
   Comment("Время закрытия последнего открытого ордера = ", lastOrderCloseTime);
   return (lastOrderCloseTime);
}

Aus irgendeinem Grund, auch wenn die Aufträge geschlossen sind und der letzte Auftrag Abschlusszeit sollte nicht Null sein.

Wir haben das immer wieder in den Kommentaren:

Время закрытия последнего открытого ордера = 0

Das ist der Grund, warum mein Code nicht weiter funktioniert, weil diese Funktion nicht funktioniert.

 
hoz:

Also habe ich das ganze Chaos umgeschrieben, und es kam so heraus:

Aus irgendeinem Grund sollte auch bei geschlossenen Aufträgen der letzte Auftragsschlusszeitpunkt entsprechend nicht Null sein.

Ich konnte es die ganze Zeit in meinem Kommentar unterbringen:

Deshalb funktioniert nach meinem Code nichts, denn diese Funktion lässt mich nicht rein.

Dieser EA berücksichtigt schwebende Aufträge in Ihrem Code. Nun, es wird die offenen Aufträge entsprechend durchsuchen. Natürlich wird sie nach Ablauf der Zeit Null ergeben.

Wenn Sie die abgeschlossenen Aufträge sehen möchten, müssen Sie sie in der Liste der abgeschlossenen Aufträge anzeigen:

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

и

if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;

Aber... müssen wir zwei Funktionen erstellen - eine sucht nach offenen Aufträgen und die andere nach geschlossenen Aufträgen.

 
artmedia70:

Dabei werden auch Ihre ausstehenden Aufträge berücksichtigt. Und dementsprechend sieht er die offenen Aufträge durch. Natürlich wird sie nach Ablauf der Zeit Null ergeben.

Wenn Sie die abgeschlossenen Aufträge sehen wollen, sollten Sie sie in der Liste der abgeschlossenen Aufträge sehen:

и

Aber... müssen wir zwei Funktionen erstellen - eine sucht nach offenen Aufträgen und die andere nach geschlossenen Aufträgen.


Vielen Dank, Artyom. Ganz genau... Was nun folgt, ist eine Frage der Code-Optimierung. Es gibt Fragen zur Struktur des Codes, aber er muss mit frischem Kopf geschrieben werden.
 
hoz:

Ich werde mir Ihren Code gerne ansehen, Artem. Zum Testen des Drucks ist es nicht die günstigste Variante...

Hier ist ein EA zum Testen der Funktion. Sie enthält die Funktion selbst und ihren Aufruf. Vor dem Aufruf müssen Sie eine Nachricht vorbereiten, die bis zu vier Zeilen lang sein kann. Wenn ich mich richtig erinnere, sollte die Länge jeder Zeile 64 Zeichen nicht überschreiten. Aus diesem Grund habe ich eine Nachricht in mehrere Zeilen aufgeteilt. Jede Zeile einer Nachricht kann in einer anderen Farbe ausgegeben werden. Im Code ist das ziemlich klar - zuerst bereiten wir die Nachrichtenzeilen vor, dann rufen wir die Funktion auf. Ich habe dort nicht viel kommentiert - ich habe es vor langer Zeit in einem Rutsch geschrieben. Jetzt habe ich schon vergessen, wofür es da ist. Wenn ich Fragen habe, werde ich mich erinnern, aber ich erinnere mich nur noch an das Nötigste.

//+------------------------------------------------------------------+
//|                                                Test iPrint().mq4 |
//|                             Copyright © 2013, Artyom A. Trishkin |
//|                                                skype: artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2013, Artyom A. Trishkin"
#property link      "skype: artmedia70"
//+------------------------------------------------------------------+
//| expert variables                                                 |
//+------------------------------------------------------------------+
int            a,b,c;
string         Exp_Name, Prefix, pref,
               message1, message2, message3, message4, 
               Mass_Name_Message[10];
//+----------------------------------------------------------------------------+
int init() {
   Exp_Name=WindowExpertName(); 
   pref="_r";
   if (IsDemo()) pref="_d";
   if (IsTesting()) pref="_t";
   if (IsVisualMode()) pref="_v";
   Prefix=Exp_Name+"_"+Symbol()+pref;  
//----------------------------
   return;                                         // Выход из init() 
}
//+----------------------------------------------------------------------------+
int deinit() {
   if (!IsTesting()) {
      Comment("");
// -------- Блок удаления всех объектов, построенных на графике --------
      string Name_Del[1]; 
      int Quant_Del=0;                    
      int Quant_Objects=ObjectsTotal();   
      int LenPref=StringLen(Prefix);
      ArrayResize(Name_Del,Quant_Objects);
      for(int k=0; k<Quant_Objects; k++) {
         string Obj_Name=ObjectName(k);   
         string Head=StringSubstr(Obj_Name,0,LenPref);
         if (Head==Prefix) {                              
            Quant_Del+=1;        
            Name_Del[Quant_Del-1]=Obj_Name;
            }
        }
      for(int i=0; i<Quant_Del; i++)    
         ObjectDelete(Name_Del[i]); 
// ----- Конец блока удаления всех объектов, построенных на графике -----
      }
   return;                                // Выход из deinit()
}
//+----------------------------------------------------------------------------+
int start()
  {
//-------------------------------------------------------
// Подготавливаем первое сообщение
   message1=StringConcatenate("Первое сообщение из двух строк: Тик: ",GetTickCount()," ");
   message2=StringConcatenate("Цена Bid: ", DoubleToStr(Bid,Digits));
   iPrint(false, message1, message2, "", "", 9, Aqua, DarkOrange);   // Выводим первое
   Sleep(3000);
//-------------------------------------------------------
// Подготавливаем второе сообщение
   b=4; c=7;
   a=b+c;
   message1=StringConcatenate("Второе сообщение из трёх строк: a=",a," ");
   message2=StringConcatenate("b=",b," ");
   message3=StringConcatenate("c=",c);
   iPrint(false, message1, message2, message3, "", 9, Aqua, LimeGreen, DarkOrange); // Выводим второе
   Sleep(3000);
//-------------------------------------------------------
// Подготавливаем третье сообщение
   message1=StringConcatenate("Третье сообщение из четырёх строк: Время: ", TimeToStr(TimeCurrent())," ");
   message2=StringConcatenate("Тик: ",GetTickCount()," ");
   message3=StringConcatenate("Время бара: ",TimeToStr(Time[0])," ");
   message4=StringConcatenate("Цена Bid: ", DoubleToStr(Bid,Digits));
   iPrint(false, message1, message2, message3, message4, 9, Aqua, Aqua, Aqua, DarkOrange);// Выводим третье
   Sleep(3000);
//-------------------------------------------------------
   return(0);
  }
//+----------------------------------------------------------------------------+
// Если bool print = true или нет окна индикатора, то функция будет выводить сообщения в журнал
void iPrint(bool print, string mess1, string mess2="", string mess3="", string mess4="", 
            int sz=9, color cl1=Aqua, color cl2=Aqua, color cl3=Aqua, color cl4=Aqua) {
   string   NameGrafText, message, nm;
   int      i, y, k, LenStr, shift, Win_Num=-1, num=0;
   color    cl;
   if (mess1=="") {
      Print("Func iPrint: Передана пустая строка, выходим");
      return;
      }
   Win_Num=WindowFind("Win_Inform");
   if (print || Win_Num<0) {
      message=mess1+mess2+mess3+mess4;
      Print(message); 
      return;
      }
   k=ArraySize(Mass_Name_Message)-1;
   if (StringLen(mess1)>0) num++;
   if (StringLen(mess2)>0) num++;
   if (StringLen(mess3)>0) num++;
   if (StringLen(mess4)>0) num++;
   for (i=k; i>=0; i--) {                             
      NameGrafText=Mass_Name_Message[i];           
      if (StringLen(NameGrafText)>0)
      if (ObjectFind(NameGrafText)==Win_Num) {
         if (i+num>k) {
            ObjectDelete(NameGrafText);  
            Mass_Name_Message[i]="";
            }
         else if (i+num<=k) {             // Сдвигаем и перекрашиваем старые сообщения
            Mass_Name_Message[i+num]=Mass_Name_Message[i];
            y=ObjectGet(NameGrafText, OBJPROP_YDISTANCE);               // координата Y
            ObjectSet  (NameGrafText, OBJPROP_YDISTANCE, y+(sz+1)*num); // координата Y
            ObjectSet  (NameGrafText, OBJPROP_COLOR, DimGray);          // цвет
            }
         }
      }
   shift=num;
   int v=GetTickCount();
   for (i=0; i<num; i++) {
      shift--;
      NameGrafText=Prefix+"_Graf_Text_"+i+"_"+Symbol()+"_"+v;  // Уникальное имя объекта
      int app=0;
      while (ObjectFind(NameGrafText)==Win_Num) {
         app++;
         NameGrafText=Prefix+"_Graf_Text_"+i+"_"+Symbol()+"_"+v+"_"+app;
         }
      Mass_Name_Message[num-1-i]=NameGrafText;
      switch (i) {
         case 0: message=mess1; cl=cl1; break;
         case 1: message=mess2; cl=cl2; break;
         case 2: message=mess3; cl=cl3; break;
         case 3: message=mess4; cl=cl4; break;
         default:message=mess1; cl=cl1; break;
         }
      ObjectCreate (NameGrafText, OBJ_LABEL, Win_Num, 0, 0);
      ObjectSetText(NameGrafText, message, sz, "Courier New", cl);
      ObjectSet    (NameGrafText, OBJPROP_COLOR, cl);                   // цвет
      ObjectSet    (NameGrafText, OBJPROP_CORNER,    2);                // угол
      ObjectSet    (NameGrafText, OBJPROP_XDISTANCE, 150);              // координата Х
      ObjectSet    (NameGrafText, OBJPROP_YDISTANCE, 2+(sz+1)*shift);   // координата Y
      WindowRedraw();
      }
//---------------------------------      
   nm=Prefix+"_Balance_txt";
   message="Баланс :";
   cl=Yellow;
   SetText(message, cl, nm, 2, 4, 20, "Arial", 9, Win_Num);
   nm=Prefix+"_Balance";
   message=DoubleToStr(AccountBalance(),2);
   cl=DarkTurquoise;
   SetText(message, cl, nm, 2, 70, 20, "Arial", 9, Win_Num);
//---------------------------------      
   nm=Prefix+"_Equity_txt";
   message="Средства :";
   cl=Yellow;
   SetText(message, cl, nm, 2, 4, 8, "Arial", 9, Win_Num);
   nm=Prefix+"_Equity";
   message=DoubleToStr(AccountEquity(),2);
   cl=DarkTurquoise;
   SetText(message, cl, nm, 2, 70, 8, "Arial", 9, Win_Num);
//---------------------------------      
}
//+----------------------------------------------------------------------------+
void SetText(string Text, color cl, string nm, int angle, int x, int y, string font, int sz=0, int wnd=0) {
   if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_LABEL, wnd, 0, 0);
   ObjectSet(nm, OBJPROP_CORNER   , angle);
   ObjectSet(nm, OBJPROP_XDISTANCE, x);
   ObjectSet(nm, OBJPROP_YDISTANCE, y);
   ObjectSet(nm, OBJPROP_WIDTH    , sz);
   ObjectSetText(nm, Text, sz, font, cl);
   }
//+----------------------------------------------------------------------------+

Und einen Truthahn:

//+------------------------------------------------------------------+
//|                                                   Win_Inform.mq4 |
//|                                Copyright © 2012, Artyom Trishkin |
//|                                                skype: artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, Artyom Trishkin"
#property link      "skype: artmedia70"

#property indicator_separate_window
int start()
  {
  }
//+------------------------------------------------------------------+

So ist das nun mal... Ich hoffe, Sie werden es herausfinden.

Natürlich können Sie ein Underlay erstellen, anstatt es im Hauptdiagramm auszugeben, aber ich bin zu faul, um das zu tun... :)

 
artmedia70:

Hier ist ein EA zum Testen der Funktion. Sie enthält die Funktion selbst und ihren Aufruf. Vor dem Aufruf müssen Sie eine Nachricht vorbereiten, die bis zu vier Zeilen lang sein kann. Wenn ich mich richtig erinnere, sollte die Länge jeder Zeile 64 Zeichen nicht überschreiten. Aus diesem Grund habe ich eine Nachricht in mehrere Zeilen aufgeteilt. Jede Zeile einer Nachricht kann in einer anderen Farbe ausgegeben werden. Im Code ist das ziemlich klar - zuerst bereiten wir die Nachrichtenzeilen vor, dann rufen wir die Funktion auf. Ich habe dort nicht viel kommentiert - ich habe es vor langer Zeit in einem Rutsch geschrieben. Jetzt habe ich schon vergessen, wofür es da ist. Wenn ich Fragen habe, werde ich mich erinnern, aber ich erinnere mich nur noch an das Nötigste.

Und einen Truthahn:

So ist das nun mal... Ich hoffe, Sie werden es herausfinden.

Natürlich können Sie ein Underlay erstellen, anstatt es im Hauptdiagramm auszugeben, aber ich bin zu faul, um das zu tun... :)


 

Gute Leute! Ich habe einen EA geschrieben, alles scheint in der Realität gut zu funktionieren. Aber ich überprüfe es auf dem Testgerät - es funktioniert nicht. Im Wesentlichen geht es um Folgendes. Der Expert Advisor sollte Aufträge durch horizontale Linien auf dem Chart eröffnen. Im Prüfprogramm werden sie ständig auf verschiedenen Ebenen geöffnet, als ob viele Linien gesetzt worden wären, obwohl es keine gibt! Können Sie erklären, was los ist?

Ein Teil des Codes, der für die Zeilen verantwortlich ist:

int Neuer_Horizont()

{

int tip_o_buy;

int tip_o_sell;

int obj_total=ObjectsTotal();

// wenn keine neuen Zeilen, beenden

if(obj_total==0)

Rückkehr;

// if(es gibt...

if(obj_total!=0)

string name=Objektname(0);

double pr=NormalizeDouble(ObjectGet(name,1),Digits);

ObjectDelete(name); // löschen und neu setzen

if(pr>Bid+(Stop_level+1)*Point) // Bestimmung der Auftragsart

{

tip_o_sell=OP_SELLLIMIT;

tip_o_buy=OP_BUYSTOP;

}

if(pr<Bid-(Stop_level+1)*Point)

{

tip_o_sell=OP_SELLSTOP;

tip_o_buy=OP_BUYLIMIT;

}

// Aufträge festlegen

OrderSend(Symb,tip_o_sell,Value,pr,3,pr+StopLoss*Point,pr-TakeProfit*Point, "Order gesetzt");

Prov_oshibok();

................................

}

Mit anderen Worten: obj_total==0 und das ist alles. Aber aus irgendeinem Grund setzt es alles auf unendlich.

 
Hallo zusammen.
Ist es normal, dass das Protokoll nicht anzeigt, dass ein schwebender Auftrag ausgelöst wurde? Das passiert im Prüfgerät.
Das Konto ist echt.
 
Dozol:

Gute Leute! Ich habe einen EA geschrieben, alles scheint im echten Leben gut zu funktionieren, alles ist normal. Aber wenn ich es auf dem Testgerät prüfe, kommt es zu Störungen.


Ich glaube es nicht, dieser EA kann weder auf der realen Seite noch im Testgerät funktionieren.
Grund der Beschwerde: