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

 
d1w4m3:


Grazie per la risposta, ma ho appena iniziato a imparare da un paio di settimane, come implementare questo nel codice, o dimmi dove leggere per favore. O secondo Igor Kim?

Eppure aprirà una posizione, non secondo il sistema, quando appena inizia il suo lavoro, la vostra condizione non evita questo problema.

E se ci pensate? Perché non evita il problema?

Quando inizia a lavorare, e se non ha lavorato prima (in generale la prima corsa), allora non c'è ancora stata la sua posizione, e la logica mostrerà che l'ultima posizione chiusa semplicemente non esiste ancora. Questo significa che non avrebbe potuto essere chiuso né allo stop né al take, il che a sua volta dà il permesso di aprire una posizione sul segnale.

Non è vero?

 
Artyom Trishkin:

E se ci pensate? Perché non evita il problema?

Quando inizia a funzionare, e se non ha funzionato prima (prima esecuzione in assoluto), non c'è ancora stata una posizione, e la logica mostrerà che l'ultima posizione chiusa semplicemente non esiste ancora. Questo significa che non avrebbe potuto essere chiuso né allo stop né al take, il che a sua volta dà il permesso di aprire una posizione sul segnale.

Non è vero?


Questo è il punto: da un segnale! Ma la condizione può essere soddisfatta non sulla barra 2 (non appena l'indicatore ha cambiato il buffer) ma su qualsiasi seconda barra (dopo che tutto funziona attraverso il sistema, naturalmente). Il problema è nella condizione di aprire gli ordini, come risolverlo ma sulla 2a barra dopo il cambiamento del buffer dell'indicatore?

void OnTick()

{
uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 0, n), 4);
dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 1, n), 4);
se(DN_Trend()==vero)
{
if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, 0, "Sloper", Magic, 0, Red);
se (biglietto > 0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
se (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Stampa("Errore di vendita");
}

}


 
d1w4m3:


Beh, il punto è che si basa sul segnale! Ma la condizione può soddisfare non sulla 2a barra (non appena l'indicatore ha cambiato il buffer) ma su qualsiasi seconda barra (dopo che tutto funziona con il sistema, naturalmente). Il problema è nella condizione di aprire gli ordini, come risolverlo ma sulla 2a barra dopo il cambiamento del buffer dell'indicatore?

void OnTick()

{
uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 0, n), 4);
dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 1, n), 4);
se(DN_Trend()==vero)
{
if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, 0, "Sloper", Magic, 0, Red);
se (biglietto > 0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
se (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Stampa("Errore di vendita");
}

}


Inserire il codice correttamente. C'è un pulsante SRC nel menu dell'editor di messaggi.
Non ho capito nulla dalle sue spiegazioni.
 
d1w4m3:


Questo è il punto! Ma la condizione può essere soddisfatta non sulla barra 2 (appena l'indicatore ha cambiato il buffer), ma su qualsiasi seconda barra (dopo che tutto funziona con il sistema, naturalmente). Il problema è nella condizione di aprire gli ordini, come risolverlo ma sulla 2a barra dopo il cambiamento del buffer dell'indicatore?

void OnTick()
{
  uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 0, n), 4);
  dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 1, n), 4); 
  
if(DN_Trend()==true)
{
  if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
  { 
   ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
      if (ticket > 0)
      {
         SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
         TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
         
         if (OrderSelect(ticket, SELECT_BY_TICKET))
         if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
           Print("Ошибка на продажу");
      }

  }


1. questo è come sarebbe il codice se inserito correttamente. C'è una ragione per cui gli sviluppatori hanno pensato a questo...

2. un sottile suggerimento: dove sono Open[4] e Close[4] rispetto ai valori dell'indicatore?

 
extern int TakeProfit  = 200;
extern double Lots     = 0.1;
extern int StopLoss    = 52;
extern int Magic       = 1111;
extern int Slippage    = 3;
extern int n           = 3; // На какую свечу открывать ордер
//------------------------------------------------------------------
extern int  LevelWLoss  = 1;      // Уровень безубытка
extern int  LevelProfit = 30;     // Уровень профита
//------------------------------------------------------------------
extern string    Slope  = "Параметры Slope";
extern int       period = 163; 
extern int       method = 3;                         
extern int       price  = 0;    
//------------------------------------------------------------------
double uptr, SL, TP, dntr;
int    ticket, nd;
bool   fm;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   if (Digits == 3 || Digits == 5)
   {
       TakeProfit  *=10;
       StopLoss    *=10;
       Slippage    *=10;
       LevelWLoss  *=10;
       LevelProfit *=10;
   }
   return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 0, n), 4);
  dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 1, n), 4); 
  
if(DN_Trend()==true)
{
  if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
  { 
   ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
      if (ticket > 0)
      {
         SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
         TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
         
         if (OrderSelect(ticket, SELECT_BY_TICKET))
         if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
           Print("Ошибка на продажу");
      }
  }
}//if(DN_Trend()==true)

if(UP_Trend()==true)
{
   if( CountBuy() == 0  && Ask > uptr && Open[3] > uptr && Close[3] > uptr  )
  {
   ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "Sloper", Magic, 0, Blue);
      if (ticket>0)
      {
         TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
         SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
         
         if (OrderSelect(ticket, SELECT_BY_TICKET))
            if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
               Print("Ошибка на покупку");
       }
    }
}//if(UP_Trend()==true)

      if ( CountSell()>0  && Open[3] > uptr && Close[3] > uptr && UP_Trend()==true)
      {
      for(int i = OrdersTotal() -1; i>=0; i--)
          {
            if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
            if (OrderMagicNumber() == Magic && OrderType() == OP_SELL)
            if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))
            Print("Ошибка");
            }
          }
      }
      if ( CountBuy()>0 && Open[3] < dntr && Close[3] < dntr && DN_Trend()==true)
      {
      for(int i = OrdersTotal() -1; i>=0; i--)
          {
            if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
            if (OrderMagicNumber() == Magic && OrderType() == OP_BUY)
            if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black))
            Print("Ошибка");
            }
          }
      }
      //+переход в безубыток+
   for( int i=0; i<OrdersTotal(); i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
        if(OrderSymbol()== Symbol() && OrderMagicNumber()==Magic)
          {
            if(OrderType()==OP_BUY) 
              {
                if(OrderStopLoss()-OrderOpenPrice()<LevelWLoss*Point) 
                 {
                   if(Bid-OrderOpenPrice()>LevelProfit*Point) 
                 {
                  fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+LevelWLoss*Point,OrderTakeProfit(),CLR_NONE);
                 }
              }
            }
           }
         if(OrderType()==OP_SELL) 
           {
            if(OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss()<LevelWLoss*Point) 
              {
               if(OrderOpenPrice()-Ask>LevelProfit*Point) 
                 {
                  fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-LevelWLoss*Point,OrderTakeProfit(),CLR_NONE);
                 }
              }
           }
       
        }
     }
     
//------------  комментарии -----------------+     
  if(UP_Trend()) Comment("Восходящий тренд ", uptr);
  if(DN_Trend()) Comment("Нисходящий тренд ", dntr);
 
 }
//+------------------------------------------------------------------+
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 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);
}
//+------------------------------------------------------------------+
bool UP_Trend()
{
  if(uptr > 0 && uptr != 2147483647.0) return(true);
  return(false);
}
//+------------------------------------------------------------------+
bool DN_Trend()
{
  if(dntr > 0 && dntr != 2147483647.0) return(true);
  return(false);
}
//+------------------------------------------------------------------+
 

Se inseriamo la vostra condizione " Questo significa che non poteva essere chiuso né allo stop né al take, che a sua volta dà il permesso di aprire una posizione sul segnale. "

E il mio segnale è"if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)" (insieme allo spostamento dell'indicatore n=3),

Si scopre che se è posizionato immediatamente sul grafico, si aprirà su una tendenza al ribasso, dal momento dell'inizio sulla terza candela, e poi, se c'è un segnale, si aprirà come necessario.

 
d1w4m3:

Se inseriamo la vostra condizione " Questo significa che non poteva essere chiuso né allo stop né al take, che a sua volta dà il permesso di aprire una posizione sul segnale. "

E il mio segnale è"if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)" (insieme allo spostamento dell'indicatore n=3),

Risulta che se è posizionato immediatamente sul grafico, apre su una tendenza al ribasso al momento dell'inizio sulla terza candela, e poi, se c'è un segnale, apre come richiesto.

Non capisco niente. Che cosa avete che non capite? Non potete determinare che l'ultima posizione è stata chiusa allo stop o al take? Non riesci a trovare un posto nel tuo codice dove controllare questa condizione?

O cosa non si può fare?

Come può aprirsi sulla terza candela? O spiegare cosa significa "si aprirà sulla terza candela"? Cosa significa questo?
 

ogni volta che un ordine si apre su un segnale indicatore, come posso memorizzare il tipo di questo segnale in una variabile?

C'è un bug (quando eseguo l'EA), l'ordine non si apre all'inizio di un trend (non secondo un cambiamento nel colore dell'indicatore), perché la mia condizione non si riferisce a candele specifiche, ma dice che se il trend è su o giù si apre all'inizio di 3 candele


 

Buon pomeriggio a tutti.

Mi sto chiedendo come analizzare le statistiche di lavoro in EXCEl

Chi può dirmi cosa può essere estratto via DDE da mt4 e dove posso ottenere tutte le funzioni consentite per il trasferimento in excel

Sarò molto grato per l'aiuto

 
Maxim Shershnev:

Buon pomeriggio a tutti.

Mi sto chiedendo come analizzare le statistiche di lavoro in EXCEl

Chi può dirmi cosa può essere estratto via DDE da mt4 e dove posso ottenere tutte le funzioni consentite per il trasferimento in excel

Sarò molto grato per l'aiuto

C' è tutto il necessario. Il formato di registrazione .csv scrive su excell
Файловые операции - Справочник MQL4
Файловые операции - Справочник MQL4
  • docs.mql4.com
Файловые операции - Справочник MQL4
Motivazione: