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.