OrderClose non funziona - pagina 5

 
Grazie GumRai
 

Salve,


Collego l'EA a diversi grafici di valuta. L'EA aprirà molti ordini in un singolo grafico se le condizioni sono soddisfatte. Quale codifica per garantire un solo ordine per grafico?

 
chuale:

Salve,


Collego l'EA a diversi grafici di valuta. L'EA aprirà molti ordini in un singolo grafico se le condizioni sono soddisfatte. Quale codifica per assicurare un solo ordine per grafico?


Eseguire un loop attraverso gli ordini aperti e controllare il numero magico e il simbolo.

Se c'è già un ordine aperto, non aprirne altri.

PS. Avresti dovuto davvero iniziare un nuovo thread, dato che la tua domanda non è in alcun modo collegata al titolo del thread :)

 
chuale:

Ciao thrdel,

Time[0] si riferisce al tempo della barra 0? C'è Time[1], Time [2] ecc? Ho provato a cercarlo su Google ma non ci sono molte informazioni su internet. Inoltre, se collego questo EA a due coppie di valute, significa che OrderSelect seleziona solo gli ordini nel grafico stesso o tutti gli ordini nel terminale?




Time[0] è il tempo in cui è iniziata la barra corrente. Sì, Time[1] è il tempo in cui è iniziata la barra precedente e così via.

Se vuoi eseguire lo stesso EA su più di un grafico, devi assicurarti che la variabile "MagicMunber" sia diversa per ogni EA anche se hai lo stesso simbolo su diversi grafici.

In questo modo gli EA non interferiranno con gli ordini degli altri.

OrderSelect() non prende il valore dal grafico ma dal server.

Le informazioni sul tuo conto e gli ordini sono memorizzati sul server ed è per questo che quando spegni il tuo computer, il tuo ordine stop o tp è ancora eseguito.

 
chuale:

Ciao thrdel,


Perché ricevo questo messaggio di avvertimento "conversione implicita da 'numero' a 'stringa' postin forum.mq4 69 61" per la codifica " if(ticket<0)Print("Error OP_BUY order failed, error: "+GetLastError());"?


Se volete visualizzare una variabile doppia con Comment() o se volete stampare con Print(), dovete convertirla in stringa con la funzione DoubleToString().

Per le variabili int la conversione è ovvia, quindi se non usi IntToString () per farlo, compilerà e funzionerà comunque, dato che è così ovvio.

 
chuale:

Ciao,


Allego l'EA a diversi grafici di valuta. L'EA aprirà molti ordini in un singolo grafico se le condizioni sono soddisfatte. Quale codifica per garantire un solo ordine per grafico?


Ciao Chuale,

Ho fatto un paio di modifiche al tuo EA per farlo funzionare.

MagicNumber è una variabile che devi assicurarti che sia diversa su ogni grafico!

Se vuoi che ti spieghi perché e come funzionano le modifiche, scrivimi e sarò felice di aiutarti se posso.

Puoi fare dei test tu stesso e vedere come funziona, io l'ho testato su USDJPY.

Le variabili Max e Min sostituiscono i valori 1 e -1 nella tua condizione, quindi puoi ottimizzare e vedere se altri valori funzionano meglio.


if(bar2 <-1) //changed to 
if(bar2 < Min
if(bar2 > 1) //changed to 
if(bar2 > Max

Sai come ottimizzare i parametri?

Se hai qualche domanda fammi sapere o pm.

Ecco il codice:

//+------------------------------------------------------------------+
//|                                                 chuale_test1.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.abc.com"
#property version   "1.00"
#property strict

extern double   TakeProfit=150;
extern double   Lots=0.1;
extern double   StopLoss=300;
extern int      Max = 6;
extern int      Min = -9;
extern int      MagicNumber = 12345;
extern int      Slip  = 3;
double     bar1;
double     bar2;
double     bar3;
double     bar3max,bar3min;
int        myTrades,ticket;
datetime   previousTime;
int        xMultiply;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {

//---
if(Digits==3) xMultiply=100;
if(Digits==5) xMultiply=10000;
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
 
   myTrades = CountTrades();
//
   bar1=(iClose(Symbol(),0,2)-iClose(Symbol(),0,3))*xMultiply;
   bar2=(iClose(Symbol(),0,1)-iClose(Symbol(),0,2))*xMultiply;
   bar3=(iClose(Symbol(),0,0)-iClose(Symbol(),0,1))*xMultiply;
   //
   if(myTrades>0)
     {
      if(bar3<Min) CloseThisSymbolAll("OP_BUY");
      if(bar3>Max) CloseThisSymbolAll("OP_SELL");
     }
  //
   if(Time[0]==previousTime) return(0);    
   previousTime=Time[0];          
   //
   if(myTrades<1)
     {
      if(bar2>1)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Chua EA",MagicNumber,0,Green);
         if(ticket<0)Print("Error OP_BUY order failed. error : "+GetLastError()); 
         return(0);
        }
      if(bar2<-1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid+-TakeProfit*Point,"Chua EA",MagicNumber,0,Red);
         if(ticket<0)Print("Error OP_SELL order failed. error : "+GetLastError());
         return(0); 
        }
     }
   return(0);
  }
//========================================================================
int CountTrades()
{
int count=0;
int trade;
for(trade=OrdersTotal()-1;trade>=0;trade--)
   {
   OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
   if(OrderSymbol()!=Symbol() || OrderMagicNumber() != MagicNumber)
   continue;
   if(OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber)
   if(OrderType()==OP_SELL || OrderType()==OP_BUY)
   count++;
   }
return(count);
}
//========================================================================
void CloseThisSymbolAll(string direction)
  {
  string dir = direction;
   int trade;
   for(trade=OrdersTotal();trade>=0;trade--)
     {
      OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()!=Symbol()) continue;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
        {
         if(OrderType()==OP_BUY && dir == "OP_BUY")OrderClose(OrderTicket(),OrderLots(),Bid,Slip,Blue);
         if(OrderType()==OP_SELL&& dir == "OP_SELL")OrderClose(OrderTicket(),OrderLots(),Ask,Slip,Red);
        }
     }
  }
//========================================================================
 

Ciao Thrdel,


Grazie mille. sei molto gentile e disponibile. Grazie ancora.

 

Ciao Thrdel,

Questo significa che devo provare con diversi valori di Max e Min per ogni backtest per determinare quale sia il valore più ottimale?

Grazie

Motivazione: