Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 97

 
hoz:



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

Tipo, int o datetime
 
artmedia70:
Una volta ho fatto una funzione che emette messaggi in una finestra vuota dell'indicatore. È possibile regolare i colori delle linee visualizzate. È già debuggato. Se ne hai bisogno, posso condividerlo.


Guarderò volentieri il tuo codice Artem. Per testare la stampa, non è l'opzione più conveniente...
 

r772ra:

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

Che cos'è?


Tipo, int o datetime

Ho riscritto tutto il casino ed è venuto fuori così:

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
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);
}

Per qualche motivo, anche quando gli ordini sono chiusi e l'ultimo tempo di chiusura dell'ordine non dovrebbe essere zero.

Ce l'abbiamo sempre nei commenti:

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

Ecco perché il mio codice non funziona più, perché questa funzione non funziona.

 
hoz:

Così ho riscritto tutto il casino ed è venuto fuori così:

Per qualche motivo anche quando gli ordini sono chiusi e l'ultimo tempo di chiusura dell'ordine dovrebbe essere corrispondentemente non zero.

Sono stato in grado di farlo entrare nel mio commento per tutto il tempo:

Ecco perché non funziona nulla secondo il mio codice, perché questa funzione non mi fa entrare.

Questo EA considera gli ordini pendenti nel tuo codice. Bene, cercherà di conseguenza tra gli ordini aperti. Naturalmente, restituirà un tempo di chiusura pari a zero.

Se vuoi vedere gli ordini chiusi, devi visualizzarli nella lista degli ordini chiusi:

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

и

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

Ma... abbiamo bisogno di fare due funzioni - una cerca gli ordini aperti e l'altra cerca gli ordini chiusi.

 
artmedia70:

Prende anche in considerazione i tuoi ordini in sospeso. E di conseguenza cerca tra gli ordini aperti. Naturalmente, restituirà un tempo di chiusura pari a zero.

Se vuoi vedere gli ordini chiusi, devi visualizzarli nella lista di quelli chiusi:

и

Ma... abbiamo bisogno di fare due funzioni - una cerca gli ordini aperti e l'altra cerca gli ordini chiusi.


Grazie, Artyom. Esattamente... Quello che viene dopo è una questione di ottimizzazione del codice. Ci sono domande sulla struttura del codice, ma dovrà essere scritto a mente fresca.
 
hoz:

Guarderò volentieri il tuo codice, Artem. Per testare la stampa, non è la variante più conveniente...

Ecco un EA per testare la funzione. Contiene la funzione stessa e la sua chiamata. Prima di chiamarlo, dovete preparare un messaggio, che può essere fino a quattro righe. La lunghezza di ogni linea, se ricordo bene, non dovrebbe superare i 64 caratteri. Ecco perché ho diviso un messaggio in più righe. Ogni linea di un messaggio può essere emessa in un colore diverso. È abbastanza chiaro nel codice - prima prepariamo le linee dei messaggi, poi chiamiamo la funzione. Non ho commentato molto lì - l'ho scritto tutto d'un fiato molto tempo fa. Ora ho già dimenticato a cosa serve. Se avrò delle domande, me ne ricorderò, ma ora ricordo solo le cose necessarie.

//+------------------------------------------------------------------+
//|                                                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);
   }
//+----------------------------------------------------------------------------+

E un tacchino:

//+------------------------------------------------------------------+
//|                                                   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()
  {
  }
//+------------------------------------------------------------------+

È così che va... Spero che lo capirai.

Naturalmente, si può fare un underlay invece di emettere il grafico principale, ma sono troppo pigro per farlo... :)

 
artmedia70:

Ecco un EA per testare la funzione. Contiene la funzione stessa e la sua chiamata. Prima di chiamarlo, dovete preparare un messaggio, che può essere fino a quattro righe. La lunghezza di ogni linea, se ricordo bene, non dovrebbe superare i 64 caratteri. Ecco perché ho diviso un messaggio in più righe. Ogni linea di un messaggio può essere emessa in un colore diverso. È abbastanza chiaro nel codice - prima prepariamo le linee dei messaggi, poi chiamiamo la funzione. Non ho commentato molto lì - l'ho scritto tutto d'un fiato molto tempo fa. Ora ho già dimenticato a cosa serve. Se avrò delle domande, me ne ricorderò, ma ora ricordo solo le cose necessarie.

E un tacchino:

È così che va... Spero che lo capirai.

Naturalmente, si può fare un underlay invece di emettere il grafico principale, ma sono troppo pigro per farlo... :)


 

Brava gente! Ho scritto un EA, tutto sembra funzionare bene nella vita reale. Ma lo controllo sul tester - si blocca. Il succo è il seguente. L'Expert Advisor dovrebbe aprire gli ordini con linee orizzontali disegnate sul grafico. Nel tester, li apre sempre a vari livelli, come se fossero state impostate molte linee, anche se non ce ne sono! Puoi spiegare cosa c'è che non va?

Una parte del codice responsabile delle linee:

int New_gorizont()

{

int tip_o_buy;

int tip_o_sell;

int obj_total=ObjectsTotal();

// se non ci sono nuove linee, uscire

se(obj_total==0)

ritorno;

// se(ci sono...

if(obj_total!=0)

stringa name=ObjectName(0);

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

ObjectDelete(name); // cancella e imposta di nuovo

if(pr>Bid+(Stop_level+1)*Point) // determina il tipo di ordine

{

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;

}

// impostare gli ordini

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

Prov_oshibok();

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

}

In altre parole, obj_total==0 e basta. Ma imposta e imposta tutto all'infinito per qualche motivo.

 
Ciao a tutti.
È normale che il log non mostri che un ordine pendente è scattato? Succede nel tester.
Il conto è reale.
 
Dozol:

Brava gente! Ho scritto un EA, tutto sembra funzionare bene nella vita reale. Ma lo controllo sul tester e si blocca.


Non ci credo, questo EA non può funzionare né sul sito reale né nel tester.