Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 360

 

Buon pomeriggio.

Potete per favore consigliarmi come scrivere correttamente il codice quando faccio trading EA in MT4, sono molto nuovo nella programmazione.

Devo selezionare l'ultimo ordine chiuso e confrontare il suo profitto. Non devo fare nulla se il suo profitto è superiore a 0, se è inferiore a 0, devo fare qualcosa.

double GetSizeLot(double lastlot=0) //Функция возвращает значение лотов 
  {
   double Lot2,MinLots,MaxLots;
   int j=OrdersHistoryTotal();
   
   MinLots=Lots;
   MaxLots=MaxLot;
   if(!DynamicLot)Lot2=Lots;
   if(lastlot<Lot2)lastlot=Lot2;
   
   if(OrderSelect(j,SELECT_BY_POS,MODE_HISTORY))
     {
     if(OrderProfit()<0) lastlot=lastlot*Martin;
     if(OrderProfit()>0) lastlot=Lot2;
     }
   Lot2=lastlot;
   if(Lot2 < MinLots) Lot2 = MinLots;
   if(Lot2 > MaxLots) Lot2 = MaxLots;
   return(NormalizeDouble(Lot2,2));
  }

Ho molto rispetto, Alexander.

 
Menshikov:

Buon pomeriggio.

Puoi per favore consigliarmi come scrivere correttamente il codice quando faccio trading EA in MT4, sono molto nuovo nella programmazione.

Devo selezionare l'ultimo ordine chiuso e confrontare il suo profitto. Non devo fare nulla se il suo profitto è superiore a 0, se è inferiore a 0, devo fare qualcosa.

Ho molto rispetto, Alexander.

//+------------------------------------------------------------------+

datetime time=0; double profit=0,lots=0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
      if(OrderSymbol()==_Symbol)
         if(OrderMagicNumber()==MagicNumber || MagicNumber==-1)
            if(OrderCloseTime()>time) // находим последний в истории ордер
              {
               time=OrderCloseTime(); // запомним время
               profit=OrderProfit();  // запомним профит
               his_lt=OrderLots();    // запомним лот
              }

if(profit<0) //если профит меньше нуля
   lots=his_lt*2; // Увеличим в два раза

//+------------------------------------------------------------------+
 
Vladimir Pastushak:
Grazie mille.
 
Vladimir Pastushak:
Mi chiedo a cosa serve l'ora, perché si ricorda l'ora di chiusura, se si sceglie comunque l'ultima della lista, e il ciclo? E perché non consideri lo swap e la commissione? Anche se OrderProfit()>0, il profitto effettivo può essere negativo. Se lavorate direttamente con la lista degli ordini, allora non dovreste lasciare pezzi di codice del ciclo alla ricerca dell'ultimo ordine da chiudere. Una cosa è l'affidabilità e la certezza o la velocità. E si ha un'accozzaglia.
 
Artyom Trishkin:
Mi chiedo a cosa serve l'ora, perché si ricorda l'ora di chiusura, se si sceglie comunque l'ultima della lista, e il ciclo? E perché non consideri lo swap e la commissione? Anche se OrderProfit()>0, il profitto effettivo può essere negativo. Se lavorate direttamente con l'elenco degli ordini, non dovreste lasciare pezzi di codice del ciclo alla ricerca dell'ultimo al momento della chiusura. Una cosa è l'affidabilità e la certezza o la velocità. Quello che avete è un'accozzaglia.

Quello che lei sta suggerendo è che

   if(OrderSelect(OrdersHistoryTotal(),SELECT_BY_POS,MODE_HISTORY))

Fai questo?

La persona ha chiesto solo un ordine di guadagno, perché imporre ciò che non ha chiesto? Ma sono d'accordo con te ....

 

Si prega di consigliare come chiudere un ordine aperto in MQL4 su MT4 dopo 20 barre, cioè quando un ordine è aperto e appaiono 20 nuove barre, viene chiuso. (solo 1 ordine è sempre aperto). Per qualche motivo, questo codice non funziona nello strategy tester, e ne abbiamo bisogno per farlo.


Il codice ha il seguente significato: controlliamo se abbiamo ordini aperti, se non ne abbiamo, apriamo un ordine e registriamo nella variabile "z" il prezzo aperto della 1ª barra e poi ad ogni tick controlliamo il prezzo aperto della 20ª barra e quando la 1ª barra alla fine raggiunge la 20ª barra, il suo prezzo sarà lo stesso del prezzo registrato nella variabile "z" e quindi l'ordine sarà chiuso. (naturalmente durante il processo, i prezzi possono coincidere, ma sarà molto raro, inoltre, possiamo scrivere più parametri della 1a barra in variabili)


double z; //объявление переменной

           //ОТКРЫТИЕ ОРДЕРА
           if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер
              {
               OrderSend(Symbol(), OP_SELL, 0.1, Bid, 3, Bid+150*Point, Bid-10*Point);
                   z = Open[1]; // здесь переменной "z" присваивается цена открытия 1-го бара
              }
            else

           Print("ORDER NE USTANOVLEN!!!");




           //ЗАКРЫТИЕ ОРДЕРА

    if (z==Open[20])  //если цена записанная в переменную "z" равна цене 20-го бара, то закрывать ордер
        {
           

            //-----------------код закрывает все ордера--------------------
   bool   result;
   int    error;

 while (OrdersTotal()>0)
 {
   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
     {   if(OrderType()==OP_BUY)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if(OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
           OrderDelete(OrderTicket());
         
           if(result!=TRUE) { error=GetLastError();
              Print("LastError = ",error, " ",Symbol()); }
           else error=0; }
   else Print( "Error when order select ", GetLastError());

  }
//------------конец кода закрывающего ордер------------------
           
           
        }
      else
      Print("ORDER NE ZAKRYT!!!");
 
BEGEMOT32:

Si prega di consigliare come chiudere un ordine aperto in MQL4 su MT4 dopo 20 barre, cioè quando un ordine è aperto e appaiono 20 nuove barre, viene chiuso. (solo 1 ordine è sempre aperto). Per qualche motivo, questo codice non funziona nello strategy tester, e ne abbiamo bisogno per farlo.


Il codice ha il seguente significato: controlliamo se abbiamo ordini aperti, se non ne abbiamo, apriamo un ordine e registriamo nella variabile "z" il prezzo aperto della 1ª barra e poi ad ogni tick controlliamo il prezzo aperto della 20ª barra e quando la 1ª barra alla fine raggiunge la 20ª barra, il suo prezzo sarà uguale al prezzo registrato nella variabile "z" e quindi l'ordine sarà chiuso. (naturalmente durante il processo, i prezzi possono coincidere, ma sarà molto raro, inoltre, possiamo scrivere più parametri della 1a barra in variabili)


Ecco, l'ho capito da solo, avrei dovuto dichiarare la variabile al di fuori di int start() - ora funziona bene
 
BEGEMOT32:
Ecco, l'ho capito da solo, avrei dovuto dichiarare una variabile al di fuori di int start() - ora funziona bene

Ho semplificato un po' il tuo codice, ma ci sono ancora errori nel tuo codice

//ОТКРЫТИЕ ОРДЕРА
if(OrdersTotal()==0) // если нет открытых ордеров то открывать ордер
   if(OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid+150*Point,Bid-10*Point)<0)
      Print("ORDER NE USTANOVLEN!!!");

//-----------------код закрывает все ордера--------------------
   bool   result;
   int    error;
   while(OrdersTotal()>0)
     {
      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
        {
         if(iBarShift(OrderSymbol(),Period(),OrderOpenTime())==20)
           {
            if(OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
            if(OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
            if(OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
               OrderDelete(OrderTicket());
           }
         if(result!=TRUE)
           {
            error=GetLastError();
            Print("LastError = ",error," ",Symbol());
           }
         else error=0;
        }
      else Print("Error when order select ",GetLastError());

     }
 

Sto scrivendo un EA multivaluta ma non riesco a capire perché restituisce prezzi diversi allo stesso tempo se lo collego a diverse valute

In breve, il codice:

a Init

EventSetTimer(60);

in OnTimer()

MqlTick last_tick;
if(SymbolInfoTick("EURNZD",last_tick))
{
    Print("Last Ask: ", last_tick.ask);
}

Se provo il mio EA su EURNZD, per esempio

2015.05.18 00:07:00 Lat Ask: 1.5370

Se uso qualsiasi altra coppia di valute

2015.05.18 00:07:00 Lat Ask: 1.5323

Questo valore è totalmente diverso, e nel secondo caso, secondo il grafico, non ci potrebbe essere un tale valore per almeno diverse ore

Nello Strategy Tester tutti i tick sono in modalità trade, ho la sensazione che se non è la coppia principale, i valori nello Strategy Tester sono approssimativi

Ho dimenticato di aggiungere che questo è Meta Trade 5

Ho scoperto che la prima volta che lo faccio, il prezzo è sbagliato e la seconda volta che lo faccio, il prezzo è normale

 
1.Puoi scoprire dalla storia quanti tick sono stati su e giù nel volume dei tick?

2.Sono passati alcuni mesi da quando ho cancellato autochartis, ma i messaggi di log continuano ad apparire. Il software continua a cercare di aprire i file.

Come cancellare completamente autochartis?

2015.05.25 15:36:42.983 Cannot open file 'C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\................................\MQL4\indicators\Autochartist Volatility.ex4' [2]
2015.05.25 15:36:42.983 Cannot open file 'C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\................................\MQL4\indicators\Autochartist Key Levels.ex4' [2]
2015.05.25 15:36:42.982 Cannot open file 'C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\................................\MQL4\indicators\Autochartist Chart Patterns.ex4' [2]

Motivazione: