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

 
Taras Slobodyanik #:

Perché avete bisogno di 3 metodi?
è sufficiente fare tutto in uno

  • controllato l'ordine

- modificato
- non modificato

Questo è interessante!

Taras, diciamo che abbiamo tre ordini di acquisto con TP e SL, poi in un ordine abbiamo modificato SL.

Domanda: Come trovo l'ordine che è stato modificato?

 
Taras Slobodyanik #:

Perché avete bisogno di 3 metodi?
è sufficiente fare tutto in un solo

  • controllato l'ordine

- modificato
- non modificato

Ce ne sono già due, uno controlla la dimensione dell'array tramite OrdersTotal() dove sono memorizzati i biglietti degli ordini modificati, e l'altro cerca questo array per i biglietti. Ma ora ho cambiato il codice altrove, non collegato a tutto questo, e per qualche motivo sto catturando un errore (array overrun).
 
MakarFX #:

Interessante!

Taras, diciamo che ci sono tre ordini di acquisto con TP e SL, poi in un ordine SL è stato cambiato.

Domanda: Come trovo l'ordine che è stato cambiato?

Ovviamente, lo SL (o TP) è stato cambiato per una ragione, giusto?
Dovremmo controllarlo in base ad alcune condizioni.

Poi al prossimo controllo questa condizione sarà definita come "soddisfatta" - l'ordine è già stato modificato.


PS. Se stiamo parlando di modifica manuale, qualcuno cambierà qualcosa senza che l'EA lo sappia, allora ovviamente abbiamo bisogno di raccogliere una struttura di array e confrontarla costantemente con gli ordini di mercato.

 
Taras Slobodyanik #:

Perché avete bisogno di 3 metodi?
è sufficiente fare tutto in un solo

  • controllato l'ordine

- modificato
- non modificato

L'ordine non è 1, diciamo che ce ne sono 10. Scrivo il biglietto di ogni modificato in un array. Ma finora questo è un problema.
 
MakarFX #:

Rimosso

MakarFX, grazie! Ora non c'è un primo ordine extra non di segnale, ma ora per qualche ragione il primo ordine di segnale (normale) sta entrando 2 candele prima))) Ho allegato uno screenshot del tester al mio messaggio, ma anche a dispetto di questo primo ordine - la cosa più importante è fatta, grazie mille ancora) Con i maghi l'ho ottenuto, poi farò una variabile esterna e quando attacco l'espert a un grafico particolare di coppia di valute, cambierò il numero per ogni coppia individualmente.

 
Nerd Trader #:
L'ordine non è 1, ci sono 10 ordini. Scriverò il biglietto di ogni modificato nell'array. Ma finora c'è un problema.

non importa quanti ordini ci sono - se il TP/SL non deve essere cambiato, secondo le condizioni = l'ordine è già stato modificato.

 
SanAlex #:

quello è buono per divertirsi nel tester.

e questo è per voi, come regalo - per fare soldi.

\\\\\\\\\\\\\\\\\\\\\\\\\\

L'ho eseguito per test - vedremo come funziona stasera.

\\\\\\\\\\\\\\\\\\\\\\\\\\\

ha controllato come cambia il modello su tutti i grafici - tutto ha funzionato! -come il profitto complessivo ha raggiunto l'obiettivo.


SanAlex, molto interessante, esaminerò sicuramente questo EA in dettaglio, grazie!

 

Ragazzi, buona giornata sul codice consigliare, ecco un grafico a destra dei due mestieri meno comprare - è coperto da un vendere, vendere comprare, secondo l'algoritmo dovrebbe entrare nel comprare, ma perché - poi questi due fi-zioni, che sembrano e produrre un commercio meno il più recente nella storia - mostrano entrambi nel più! Come scrivere e dove l'errore - questo flip TC, la media - questi stessi f-It funzionano correttamente, in breve, dopo il meno-venduto - devono aprire comprare, ma non si apre, perché In altre parole, dovrebbe aprire buy se il mio ordine sta perdendo, ma buy non si apre, perché f-i pensa che se l'affare sta perdendo il più bordo, questo f-iia segnalare TRUE, altrimenti è falso, ma entrambi segnalano TRUE. Per favore, aiutatemi a decidere.



// проверка предыдущего минусового селл
bool Calc_Loss_SELL()
  {
   bool ord;
   bool TotalLot=false;
   HistorySelect(TimeCurrent()-HistoryDaysLoadI*86400,TimeCurrent());
   for(int i=HistoryDealsTotal()-1; i>=0; i--)
     {
      ulong ticket=HistoryDealGetTicket(i);
      ord=HistoryDealSelect(ticket);
      if(ord && HistoryDealGetString(ticket,DEAL_SYMBOL) == _Symbol
         && HistoryDealGetInteger(ticket,DEAL_MAGIC) == MagicC
         && HistoryDealGetInteger(ticket,DEAL_ENTRY) == DEAL_ENTRY_OUT
         && HistoryDealGetInteger(ticket,DEAL_TYPE) ==  DEAL_TYPE_BUY)
        {
         if(HistoryDealGetDouble(ticket,DEAL_PROFIT) < 0)
           {
            TotalLot=true;
            if (УСРЕДНЯЛКА) Print(" усреднение в селл разрешено ",TotalLot);
            else  Print(" ПЕРЕВОРОТ В БАЙ разрешен ",TotalLot);
            break;
           }
         else
           {
            break;
           }
        }
     }
   return (TotalLot);
  }


// проверка предыдущего минусового бай
bool Calc_Loss_BUY()
  {
   bool ord;
   bool TotalLot=false;
   HistorySelect(TimeCurrent()-HistoryDaysLoadI*86400,TimeCurrent());
   for(int i=HistoryDealsTotal()-1; i>=0; i--)
     {
      ulong ticket=HistoryDealGetTicket(i);
      ord=HistoryDealSelect(ticket);
      if(ord && HistoryDealGetString(ticket,DEAL_SYMBOL) == _Symbol
         && HistoryDealGetInteger(ticket,DEAL_MAGIC) == MagicC
         && HistoryDealGetInteger(ticket,DEAL_ENTRY) == DEAL_ENTRY_OUT
         && HistoryDealGetInteger(ticket,DEAL_TYPE) == DEAL_TYPE_SELL)
        {
         if(HistoryDealGetDouble(ticket,DEAL_PROFIT) < 0)
           {
            TotalLot=true;
            if (УСРЕДНЯЛКА) Print(" усреднение в бай разрешено ",TotalLot);
            else  Print(" ПЕРЕВОРОТ В СЕЛЛ разрешен ", TotalLot);
            break;          
           }
         else
           {
            break;
           }
        }
     }
   return (TotalLot);
  }


    //----------------------------------------------
      // проверка условий ПЕРЕВОРОТА В СЕЛЛ
      // нет поз рыночных и предыдущая сделка В БАЙ была минусовая и не было минусового селла
       Print(" Calc_Loss_BUY(): ",Calc_Loss_BUY(), " Calc_Loss_SELL(): ",Calc_Loss_SELL());
      
      if(!PositionSelect(Symbol()) && Calc_Loss_BUY() && !Calc_Loss_SELL())
        {
         m_trade.Sell(CalcLot(),_Symbol,LastTick.bid,LastTick.ask+double(SLE)*_Point,LastTick.bid-double(TPE)*_Point - _Spread*_Point);
         Print(" ПЕРЕВОРОТ БАЯ В СЕЛЛ, Calc_Loss_BUY(): ",Calc_Loss_BUY());
        }

 
      // проверка условий ПЕРЕВОРОТА в SELL
      // нет поз рыночных и предыдущий селл был минусовой И НЕ БЫЛО МИНУСОВОГО БАЙ
      
      if(!PositionSelect(Symbol()) && Calc_Loss_SELL() && !Calc_Loss_BUY())
        {
         m_trade.Buy(CalcLot(),_Symbol,LastTick.ask,LastTick.bid-double(SLE)*_Point,LastTick.ask+double(TPE)*_Point + _Spread*_Point);
         Print(" ПЕРЕВОРОТ СЕЛЛА В БАЙ, Calc_Loss_SELL(): ",Calc_Loss_SELL());
        }

Non riesco ad aprire l'acquisto, ma dovrebbe aprirlo dopo un ubutical sell!!!!!!!!!


In sostanza, il problema si riduce a determinare il profitto o la perdita è stato chiuso posizione marginale, che è diventato un commercio di acquisto o di vendita e guardare oltre sul suo tipo!

AIUTO! PLUS!

 

Buona giornata!

Ci sono due funzioni: una funzione per calcolare l'intera griglia di ordini e una funzione per chiudere gli ordini

//+------------------------------------------------------------------+
double CalculiteProfit()
{
    double oProfit = 0;
    for(int i = OrdersTotal()-1; i>=0; i--)
    {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
        if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
        {
          if (OrderType() == OP_BUY || OrderType() == OP_SELL)
          {
            oProfit += OrderProfit();
          }
        }
      }
    }
    return(oProfit);
}
//+------------------------------------------------------------------+
 double FindLastBuyPrice()
{
   int oldticket, ticket = 0;
   double oldopenprice = 0;
   
   for(int cnt = OrdersTotal()-1; cnt>=0; cnt--)
   {
    if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
     {
        if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
        {
          oldticket = OrderTicket();
          if (oldticket > ticket)
          {
            ticket = oldticket;
            oldopenprice = OrderOpenPrice();
          } 
        }
     }
   }
   return(oldopenprice);
 }
//+------------------------------------------------------------------+

Ci sono anche condizioni per gli ordini di chiusura

 double op = CalculiteProfit(); 
     if (op >= Profit)
     {
       ClosseAll();
     }

Profitto - nelle impostazioni in valuta di deposito

L'idea di tutto questo: dopo che il calcolo della griglia dell'ordine è uguale a zero piùProfitto in valuta di deposito, l'intera griglia dell'ordine è chiusa

Per favore aiutatemi a cambiare il codice in modo che ci siano punti invece di Profit. Grazie.

 
Taras Slobodyanik #:

Ovviamente, la sl (o tp) è stata cambiata per una ragione, vero?
Ma secondo alcune condizioni.

Così, al prossimo controllo questa condizione sarà definita come "soddisfatta" - l'ordine è stato modificato.


Se stiamo parlando di cambiamenti manuali, qualcuno cambierà qualcosa senza che l'EA lo sappia, allora ovviamente abbiamo bisogno di raccogliere una struttura di array e confrontarla costantemente con gli ordini di mercato.

Avevo già dimenticato... e all'inizio l'ho fatto (meno male che mi sono impegnato), ma il modo di condizionare mi sembrava inaffidabile, volevo qualcosa di più evidente per indicare un ordine che era stato cambiato.

Motivazione: