Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 151

 
Maxim Kuznetsov:

qualcosa del genere:

string level="Level"+IntegerToString(iTime(_Symbol,iBarShift(OrderCloseTime())); // ид.уровня - по времени бара (!! не по тикету)

if (ObjectFind(level)‌==-1) {

  // гор.вектора нет - видимо первый ордер из закрытых на баре

  // сделать горизонтальную линию‌

  ObjectCreate(0,level,OBJ_TREND,0,OrderCloseTime(),OrderClosePrice(),OrderCloseTime()+PeriodSeconds(_Period)*3,OrderClosePrice);

 // указывающую только вправо‌

  ObjectSetInteger(level,‌OBJPROP_RAY,1);

  ObjectSetInteger(level,OBJPROP_RAYLEFT,0);

‌ // украсить её как-то :-)

 ObjectSetInteger(level,OBJPROP_‌COLOR,....)

 ....‌

} else {

  // гор.уровень есть - значит были ордера закрытые на этом баре

  // по фантазии - обновить метки/корректировать уровень/etc‌

}‌

int TotalPos=-1;

void start()
 
{
 // остальной код

//--
  if(OrdersTotal()!=TotalPos) { // не мучаем каждый тик
   for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      History();

  
     }
  }}} TotalPos=OrdersTotal(); // запомним количество
//--
}
 
 
 
 void History() {
  string Ticket=(string)OrderTicket();
  color col=Red;
  if(OrderType()==0)col=Blue;
  datetime a=OrderOpenTime();
  double b=OrderOpenPrice();
  datetime c=OrderCloseTime();
  double d=OrderClosePrice();
  double prSep=OrderProfit()+OrderCommission()+OrderSwap();
  double prAll=0;
  int    cn=0;
  string hTicket;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      datetime ct=OrderCloseTime();
      // 60 секунд разницы между закрытием первой и последней в сетке
      if(c<=ct+60 && c>=ct-60) {
        prAll+=OrderProfit()+OrderCommission()+OrderSwap();
        hTicket=(string)OrderTicket();
        cn++;
      }
   }}}
   ObjectCreate(Ticket+"Open",OBJ_ARROW,0,a,b);
   ObjectSet(Ticket+"Open",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Open",OBJPROP_ARROWCODE,1);
     
   ObjectCreate(Ticket+"Line",OBJ_TREND,0,a,b,c,d);
   ObjectSet(Ticket+"Line",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Line",OBJPROP_WIDTH,1);
   ObjectSet(Ticket+"Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet(Ticket+"Line",OBJPROP_RAY,0);
     
   ObjectCreate(Ticket+"Close",OBJ_ARROW,0,c,d);
   ObjectSet(Ticket+"Close",OBJPROP_COLOR,Green);
   ObjectSet(Ticket+"Close",OBJPROP_ARROWCODE,3);
 
   Ticket=cn>1?hTicket:Ticket;
   ObjectCreate(Ticket+"Profit",OBJ_TEXT,0,c,d);
   ObjectSet(Ticket+"Profit",OBJPROP_ANCHOR,0);
   ObjectSetText(Ticket+"Profit",DoubleToString(prAll,2),10,"Arial",White);
   ObjectSet(Ticket+"Profit",OBJPROP_PRICE1,d);
   ObjectSet(Ticket+"Profit",OBJPROP_TIME1,c+Period()*60*2);
}

Usare un vettore come indicatore di livello è sbagliato.... non buono ....((

E se facciamo muovere un cavallo)

Nella ricerca dei livelli usare il principio della somma dei profitti al livello di prezzo il cui record esiste già...

Per esempio: qui abbiamo fatto un tentativo e sommato i profitti con un ritardo di 60 secondi

 for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      datetime ct=OrderCloseTime();
      // 60 секунд разницы между закрытием первой и последней в сетке
      if(c<=ct+60 && c>=ct-60) {
        prAll+=OrderProfit()+OrderCommission()+OrderSwap();
        hTicket=(string)OrderTicket();
        cn++;

Poi, abbiamo bisogno di un record:

Se il numero di profitti accumulati al livello > 1, allora questo è il nostro ordine - il nostro livello, da questo livello disegniamo un raggio

 

Saluti.

Sto progettando un EA con delle funzioni che ad ogni tick passano in rassegna gli ordini disponibili creati da esso e agiscono a seconda della situazione.

Potete consigliarmi come fare variabili separate per ogni nuovo ordine e per ulteriori loop per lavorare con loro? (Suppongo che questo sia qualcosa come Peremennaja+ticket=12345;)

 
Andrey Sokolov:

Saluti.

Sto progettando un EA con delle funzioni che ad ogni tick passano in rassegna gli ordini disponibili creati da esso e agiscono a seconda della situazione.

Potete consigliarmi come fare variabili separate per ogni nuovo ordine e per ulteriori loop per lavorare con loro? (Suppongo che questo sia qualcosa come Peremennaja+ticket=12345;)

Preferibilmente un array o anche un array di strutture.
 
Alexey Viktorov:
Meglio un array o anche un array di strutture.

Mi scusi, può spiegarsi meglio?
 
Andrey Sokolov:

Mi scusi, potrebbe entrare più nel dettaglio?


Qui e qui.

Viene creata una struttura e un array di tipo struttura. Al di fuori di tutto il codice.

struct trade_settings
  {
   double take;         // значения цены фиксации прибыли
   double stop;         // значение цены защитного стопа
   uchar  slippage;     // значение допустимого проскальзывания
  };
//--- создали массив типа trade_settings
trade_settings my_set[];
// присвоить значение нулевому индексу массива в основном коде
my_set[0].take = что_то;
Структуры и, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL4
Структуры и, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL4
  • docs.mql4.com
Структуры и, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL4
 

Salve.

Per favore, aiutatemi a trovare l'intersezione della linea orizzontale"ResisL" e lalinea di tendenza con l'angolo"TrndL".

TRA
 
Nikolay Fedyay:

Salve.

Per favore, aiutatemi a trovare l'intersezione della linea orizzontale"ResisL" e lalinea di tendenza con l'angolo"TrndL".

//+------------------------------------------------------------------+
//| Уравнение прямой                                                 |
//+------------------------------------------------------------------+
double EquationDirect(double left_bar, double left_price, double right_bar, double right_price, double bar_to_search) {
  return((right_bar==left_bar)?left_price:(right_price-left_price)/(right_bar-left_bar)*(bar_to_search-left_bar)+left_price);
}
//+------------------------------------------------------------------+
Se conoscete due punti coordinati della linea di pendenza e li incollate come parametri di questa funzione, l'output vi darà il prezzo del punto sulla barra_di_cerca. Resta solo da chiamare questa funzione nel ciclo della barra e confrontare il valore che restituisce con il prezzo della linea orizzontale. Se sull'ultima barra del ciclo il valore restituito dalla funzione era inferiore o uguale al prezzo della linea orizzontale, e sulla barra corrente del ciclo il valore restituito dalla funzione è maggiore del prezzo della linea, allora le coordinate X del punto di intersezione saranno il tempo corrispondente all'indice del ciclo e le coordinate Y saranno il prezzo restituito dalla funzione.
 
Artyom Trishkin:

Grazie.

Che ne dici se vuoi conoscere il punto di crossover quando non ci sono ancora barre, cioè una data nel futuro.

 
Nikolay Fedyay:

Grazie.

Che ne dici se vuoi conoscere il punto di crossover quando non ci sono ancora barre, cioè una data nel futuro.

Non ho provato questa funzione - devo sperimentare.

 
Artyom Trishkin:

Non ho provato questa funzione - devo sperimentare.

Per favore, se trovate il tempo di sperimentare, condividete il risultato.

Perché non ho idea di cosa sperimentare
.