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

 
Chi lo sa - se si chiude una parte di un ordine, il suo mago o il suo commento spariranno?
 
Renat Akhtyamov:
Chi lo sa - se si chiude una parte dell'ordine, il suo magik o il suo commento spariranno?

Il magik rimarrà, il biglietto d'ordine cambierà e il commento conterrà il biglietto d'ordine padre da#xxxxxxxxxxx. L'ordine padre avrà un biglietto d'ordine figlio: a#xxxxxxxxxxx

 
Artyom Trishkin:

Il magik rimarrà, il biglietto d'ordine cambierà e il commento conterrà il biglietto d'ordine padre da#xxxxxxxxxxx. L'ordine padre avrà un biglietto d'ordine figlio: a#xxxxxxxxxxx

Ok. Grazie!
 
geratdc:


Sì, questo K è anche invariabili esterne in top hat - forse è il valore di ritorno di qualche funzione...


Alexey, cosa puoi dire del mio problema? Cerco di attaccare il trailing stop agli ordini inversi. Avete incontrato un tale problema?

E per rispondere a qualcosa sul problema, bisogna capire il problema stesso. E da questo

geratdc:

Ho bisogno di aiuto - ho 3 ordini di stop ma l'esempio di trailing stop dai video tutorial :) solo per gli ordini non collegati, nel mio caso sono collegati da un algoritmo, cioè il takeprofit è calcolato dalla somma dei tre ordini o uno se sono entrato in un trend. Bene, ho pensato a qualcosa ma il mio Expert Advisor non ha iniziato a guadagnare di più - ha iniziato a guadagnare la stessa quantità di ordini ma ottengo 2-3 volte meno trade rispetto al mio precedente EA senza trailing. Quindi il mio trailing non è un trailing ma un'assurdità. Come dovrei inserirlo negli ordini collegati? Qualcuno può darmi un'idea? Temo di non poter pensare ad altro. Ecco il risultato del mio "trailing" - è mostrato in blu:

Il risultato di 1 test è allegato. C'è un trailing stop o no? Non capisco. Perché il profitto per lo stesso periodo non è stato aumentato? Solo il numero di accordi è diminuito di 2-3 volte?


Non riesco a capire nulla. La cosa più strana è"ho inventato qualcosa", ma hai capito cosa hai inventato? E questo è"Come lo faccio su ordini collegati". Ma poi c'è il"temo di non riuscire a pensare ad altro".

 
Alexey Viktorov:

E per rispondere a qualcosa su questo problema, bisogna capire il problema stesso. E da questo.

Non riesco a capire niente. La cosa più strana è"ho capito tutto", ma sapete cosa avete capito? E poi c'è il"Come faccio a farlo sui mandati collegati?". Ma poi c'è il"temo di non riuscire a pensare ad altro".


Da quanto ho capito, i trailing stop non possono essere applicati correttamente agli ordini, quindi dovremmo prestare molta attenzione a questa funzione CalculateProfit, cioè alla variabile "op" secondo la quale gli ordini vengono chiusi se la somma dei profitti per tutti e 3 gli ordini è uguale a TakeProfit e provare a tracciare questa variabile. Cercherò di pensare qualcosa in questa direzione. Capisco che è difficile trattare con terzi abracadabra)))).
 
geratdc:

Da quanto ho capito, i trailing stop non possono essere applicati correttamente agli ordini, per questo dovremmo dare un'occhiata più da vicino a questa funzione CalculateProfit, in particolare, alla variabile "op" secondo la quale gli ordini vengono chiusi se la somma dei profitti per tutti e 3 gli ordini è uguale a TakeProfit e provare a tracciare attraverso questa variabile. Cercherò di pensare qualcosa in questa direzione. Capisco che sia difficile trattare con terzi abracadabra))).
Perché non puoi applicarlo? È necessario non attaccare o inventare qualcosa alle funzioni degli altri, e scrivere le proprie in modo che eseguano tutto ciò che si desidera. Quale potrebbe essere il problema? Qualunque sia il numero di ordini, calcola il prezzo medio e traina da esso. Quando qualche condizione è soddisfatta, quando si passa attraverso tutti gli ordini nel ciclo, riorganizza i loro stop su un nuovo livello, che è calcolato dal prezzo medio di tutti gli ordini esistenti in una direzione.
 
//+------------------------------------------------------------------+
//|                                     BLACKJACK&HOOKERS TrailX.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double  Lots           = 0.01;
extern double  TakeProfit     = 1;
extern int     Step           = 1;

extern double  TrailXStep     = 1;
extern double  TrailXStop     = 1;

extern int     MaPeriod       = 100;
extern int     MaShift        = 1;

extern int     Magic          = 123;
extern int     Slippage       = 5;

int timeprev=0;

extern double price,op,cn,tp;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits == 3 || Digits == 5)
      //TakeProfit     *= 10;
      Step           *= 10;
      //TrailXStep     *= 10;
      //TrailXStop     *= 10;
      Slippage       *= 10;

      
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   if (timeprev == Time[0]) return;
   timeprev = Time[0];
   double maprice=iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,1); 
   op=CalculateProfit();
   cn=CountTrades();
   tp=TakeProfit;
   if (tp>TakeProfit)
   {
      TakeProfit+=tp;
   }
   
 

 
   if (cn==0 && CountBuy() + CountSell() == 0 && Ask > maprice)
   {
      if (OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "", Magic, 0, Blue)<0)
            Print("Не удалось открыть ордер на покупку");
            
   }
   
   if (cn==0 && CountBuy() + CountSell() == 0 && Bid < maprice)
   {
      if (OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", Magic, 0, Red)<0)
            Print("Не удалось открыть ордер на продажу");
            
   }
   

   
   if(cn==1 && CountBuy()==1) 
   {
      price=FindLastBuyPrice();
      if((price-Ask)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
            Print("Не удалось открыть ордер на продажу");
      }
   }
   else if(cn==1 && CountSell()==1) 
   {
      price=FindLastSellPrice();
      if((Bid-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
            Print("Не удалось открыть ордер на покупку");
      }
   }
   
   
   
   if(cn==2 && CountBuy()==1 && CountSell()==1) 
   {
      price=FindLastSellPrice();
      if((price-Bid)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
               Print("Не удалось открыть ордер на продажу");
               
      }
      else 
      price=FindLastSellPrice();
      if((Bid-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
            Print("Не удалось открыть ордер на покупку");
           
      }
   }
   else if(cn==2 && CountSell()==1 && CountBuy()==1) 
   {
      price=FindLastBuyPrice();
      if((Ask-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
               Print("Не удалось открыть ордер на продажу");
               
      }
      else 
      price=FindLastBuyPrice();
      if((price-Ask)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
            Print("Не удалось открыть ордер на покупку");
           
      }
   }
   
   Trailing();

   if (op>=tp)
   {
         CloseAll();    
   }


}    
//---------------------------------------------------------------------------------------
void Trailing()           
            {  

               if (op > (TakeProfit+TrailXStep))
               {
                  tp=(TakeProfit+TrailXStep);
               }
               if (op > (TakeProfit+TrailXStep-TrailXStop) && op < (TakeProfit+TrailXStep+TrailXStop))
               {
                  tp=(TakeProfit+TrailXStep-TrailXStop);
               }
               
            }
//---------------------------------------------------------------------------------------
double CalculateProfit()
  {
   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);
  }
//--------------------------------------------------------------------------------------
void CloseAll()
  {
   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)
              {
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                  Print("Не удалось закрыть ордер на покупку");
              }
            if(OrderType()==OP_SELL)
              {
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                  Print("Не удалось закрыть ордер на продажу");
              }
           }
        }
     }
  }
//---------------------------------------------------------------------------------------------------
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);
  }
//---------------------------------------------------------------------------------------------------
double FindLastSellPrice()
  {
   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_SELL)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               ticket=oldticket;
               oldopenprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oldopenprice);
  }
//----------------------------------------------------------------------------------------------
int CountBuy()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
            count++;
        }
     }
   return(count);
  }
//----------------------------------------------------------------------------------------------
int CountSell()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
            count++;
        }
     }
   return(count);
  }
//+---------------------------------------------------------------------------------+
int CountTrades()
{
    int count=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)
                  count++; 
         }
      }
      return(count);
}
//----------------------------------------------------------------------------------+
int FindLastOrderType()
{
      for(int i = OrdersTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            return(OrderType());
         } 
      }
      return(-1);
}
//----------------------------------------------------------------------------------+

Questa è una variante del trailing tramite la funzione CalculateProfit(), entrambe le varianti di trailing hanno gli stessi indicatori nel trading - sia nel numero di trade che nei profitti. I profitti non sono molti - ora aggiungerò la volatilità e indicatori di entrata più accurati. Penso che uno stesso indicatore possa risolvere questi problemi, giusto? Diciamo, che analizza le ultime 5 barre o qualcosa del genere. Come si chiamano questi indicatori a barre? E qual è il periodo migliore? Condividi i tuoi pensieri per favore, come posso ottenere due uccelli con un indicatore ... Ho due piccioni con una fava :)

Come vedi le barre di trailing su questo EA?

 
Alexey Viktorov:
Perché non puoi applicarlo? Non dovete attaccare o inventare qualcosa alla funzione di qualcun altro, ma scrivere la vostra in modo che faccia quello che volete. Quale potrebbe essere il problema? Qualunque sia il numero di ordini, calcola il prezzo medio e traina da esso. Quando qualche condizione è soddisfatta, quando si passa attraverso tutti gli ordini nel ciclo, riorganizza i loro stop su un nuovo livello che è calcolato dal prezzo medio di tutti gli ordini di una direzione.

Salvato, grazie. Non credo ancora. Dovrei avere una libreria nella mia testa di codici e funzioni, mentre nei video tutorial siamo passati attraverso tutta la roba che ho implementato finora. Forse migliorerò e metterò in pratica i tuoi consigli. Quello che ho inventato oggi, vi sembra uno strascico? Bene, l'Expert Advisor pesca a strascico secondo i rapporti ma non so quale sia quello corretto - lo strascico errato aumenterà solo la probabilità di perdita. Direi che ha una probabilità di 0,9 di fallire, più o meno così)))) Direi che ha molta paura del piatto e l'indicatore è debole ora - stupidamente ci uniamo alla tendenza e quando abbiamo 3 ordini e il mercato cambia improvvisamente direzione e ci dà un drawdown - perdiamo.
 
geratdc:

Salvato, grazie. Non posso ancora pensare in questo modo. Devo avere una libreria nella mia testa di codici e funzioni, e sono andato attraverso i video tutorial, è quello che sto usando ora. Forse migliorerò e metterò in pratica i tuoi consigli. Quello che ho inventato oggi, vi sembra uno strascico? Bene, l'Expert Advisor pesca a strascico secondo i rapporti ma non so quale sia quello corretto - lo strascico errato aumenterà solo la probabilità di perdita. Direi che ha una probabilità di 0,9 di fallire, più o meno così)))) Direi che ha molta paura del piatto e l'indicatore è debole ora - stupidamente ci uniamo alla tendenza e quando abbiamo 3 ordini e il mercato cambia improvvisamente direzione e ci dà un drawdown - perdiamo.

Bene, cercherò di fare la mia parte per educarvi.

Mi rivolgerò a te come "tu" quando lo invierò. Ho un'istantanea del puntatore...

Per favore ditemi, non vi sembra sbagliato chiamare la stessa funzione 5 volte sullo stesso tick? Ma questo è metà del problema. Questa funzione passa attraverso tutti gli ordini. E tutto questo 5 volte in un tick... E ho contato 4 funzioni di questo tipo. Possiamo facilmente inserire altre 3 funzioni con il ciclo per cercare tutti gli ordini senza scervellarci.

Qui ce ne sono due.

if (cn==0 && CountBuy() + CountSell() == 0 && Ask > maprice)
if (cn==0 && CountBuy() + CountSell() == 0 && Bid < maprice)
if(cn==1 && CountBuy()==1)


else if(cn==1 && CountSell()==1) 
if(cn==2 && CountBuy()==1 && CountSell()==1) 


else if(cn==2 && CountSell()==1 && CountBuy()==1)

Questi sono .

Trailing();


}    
//---------------------------------------------------------------------------------------
void Trailing()           
            {  

               if (op > (TakeProfit+TrailXStep))
               {
                  tp=(TakeProfit+TrailXStep);
               }
               if (op > (TakeProfit+TrailXStep-TrailXStop) && op < (TakeProfit+TrailXStep+TrailXStop))
               {
                  tp=(TakeProfit+TrailXStep-TrailXStop);
               }
               
            }


Non è nemmeno vicino al traino.

Per capire questo, dobbiamo capire chiaramente la definizione di trailing. Non ricordo alla lettera, ma può essere descritto nel seguente modo: "Spostamento del livello di StopLoss seguendo il prezzo al fine di diminuire le possibili perdite o aumentare il profitto "garantito".


E questo

extern double price,op,cn,tp;

come appare quando si esegue l'Expert Advisor? Probabilmente quattro linee... sono necessari?


Un'ultima cosa per oggi: non è necessario avere una biblioteca in testa. È sufficiente avere la documentazione e sapere come usarla. Non riesco ancora a ricordare tutti i parametri di iMA (_Symbol, _Period, ,,,,,) e scrivo ulteriormente solo dopo aver guardato la documentazione. E così quasi tutte le funzioni. Per fortuna hanno fatto dei tooltip non molto tempo fa che non aiutano molto. Non sto cercando di memorizzare come scrivere questi o quegli enum. Quindi devo guardare la documentazione ogni volta.

 

Potete dirmi quale funzione controlla lo stato di questa casella di controllo?