OrderClose non funziona - pagina 2

 
chuale:

Ciao a tutti,


Ora inserisco ticket e Lotti nell'OrderClose senza usare OrderTicket() e OrderLots() ma non chiude anche l'ordine. Per favore aiutatemi.



Ci sono un paio di cose che hai sbagliato. Presumo che tu voglia che questo EA lavori su coppie JPY su time frame M1. Vuoi piazzare gli ordini solo sulla nuova barra e chiudere gli ordini solo sulla nuova barra o vuoi entrare sulla nuova barra e uscire se le condizioni sono soddisfatte? Ecco cosa penso:

Prima contate gli ordini con OrdersTotal().

Poi calcola le tue variabili

Se ci sono ordini nel mercato controlla se devono essere chiusi

Se non ci sono ordini sul mercato, controlla se le condizioni di entrata sono soddisfatte.

Fammi sapere se hai qualche domanda.

//+------------------------------------------------------------------+
//|                                                 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=500;
extern double   Lots=0.1;
extern double   StopLoss=300;

double     bar1;
double     bar2;
double     bar3;
int        total,ticket;
datetime   previousTime;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {

//---

//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
   total=OrdersTotal();
/*
  counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
  IndicatorCounted() is actually for indicators not EA
  
   */

   bar1=(iClose(Symbol(),PERIOD_M1,2)-iClose(Symbol(),PERIOD_M1,3))*100;
   bar2=(iClose(Symbol(),PERIOD_M1,1)-iClose(Symbol(),PERIOD_M1,2))*100;
   bar3=(iClose(Symbol(),PERIOD_M1,0)-iClose(Symbol(),PERIOD_M1,1))*100;
   /*
   Comment("Bar1 = "+DoubleToString(bar1,Digits)+"\n"+
           "Bar2 = "+DoubleToString(bar2,Digits)+"\n"+
           "Bar3 = "+DoubleToString(bar3,Digits)+"\n"
           );
   */
//Close any orders if conditions are met
   if(total>0)
     {
      if(bar3<-1) OrderClose(ticket,OrderLots(),Bid,3,Green);
      if(bar3>1) OrderClose(ticket,OrderLots(),Ask,3,Red);
     }
   if(Time[0]==previousTime) return(0);         //EA will not go past this point unless it is a new bar
   previousTime=Time[0];                        // If it was a new bar , it's old now but continue to the end
// if no order open and new bar
   if(total<1)
     {
      if(bar2>1)// if condition met
        {
         //place buy order
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Chua EA",12345,0,Green);
         if(ticket<0)Print("Error OP_BUY order failed. error : "+GetLastError()); // if returned ticket is -1 OrderSent failed
         return(0);
        }
      // or if conditions for sell met
      if(bar2<-1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid+-TakeProfit*Point,"Chua EA",12345,0,Red);
         if(ticket<0)Print("Error OP_SELL order failed. error : "+GetLastError());
         return(0); //return to start
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+
File:
 
GumRai:


il biglietto è una variabile locale, quindi il prossimo tick non avrà lo stesso valore

Mettere fuori dalle funzioni per renderlo Globalscope

 
   total=OrdersTotal();

?????? ..... inutile

controlla correttamente quali scambi hai

cercare il giusto simbolo e il giusto magicnumber

con un orderloop potete poi selezionare il trade giusto con cui chiudere

OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,Green);

.

con il tuo metodo

si perde il valore del biglietto nel momento in cui si riavvia il pc quindi

   if(total>0)
     {
      if(bar3<-1) OrderClose(ticket,OrderLots(),Bid,3,Green);
      if(bar3>1) OrderClose(ticket,OrderLots(),Ask,3,Red);
     }

fallisce .....

 
chuale:

Perché hai citato il mio post e poi non hai aggiunto un commento?
 
Sì, ora può chiudere. grazie GumRai. ora so che il numero di ticket continua a cambiare in base ai tick, quindi come ottenere il numero di ticket dell'ordine aperto? Devo usare OrderTicket() giusto?
 
chuale:
Sì, ora può chiudere. grazie GumRai. ora so che il numero di ticket continua a cambiare in base ai tick, quindi come ottenere il numero di ticket dell'ordine aperto? Devo usare OrderTicket() giusto?

Se usi OrderTicket() allora assicurati di usare prima OrderSelect() e assicurati anche che sia il trade che vuoi chiudere.
 
chuale:
Sì, ora può chiudere. Grazie GumRai. ora so che il numero di ticket continua a cambiare in base ai tick, quindi come ottenere il numero di ticket dell'ordine aperto? Devo usare OrderTicket() giusto?


Ciao Chuale,

Ecco un modo semplice per selezionare gli ordini e chiudere gli ordini per simbolo e per numero di Magic:

//+------------------------------------------------------------------+
//|                                                 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=500;
extern double   Lots=0.1;
extern double   StopLoss=300;
extern int      MagicNumber = 12345;
extern int      Slip  = 3;
double     bar1;
double     bar2;
double     bar3;
int        myTrades,ticket;
datetime   previousTime;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {

//---

//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
   myTrades = CountTrades();//Count trades function counts this EA trades only
//
   bar1=(iClose(Symbol(),PERIOD_M1,2)-iClose(Symbol(),PERIOD_M1,3))*100;
   bar2=(iClose(Symbol(),PERIOD_M1,1)-iClose(Symbol(),PERIOD_M1,2))*100;
   bar3=(iClose(Symbol(),PERIOD_M1,0)-iClose(Symbol(),PERIOD_M1,1))*100;

//Close any orders if conditions are met
   if(myTrades>0)
     {
      if(bar3<-1) CloseThisSymbolAll();
      if(bar3>1) CloseThisSymbolAll();
     }
   if(Time[0]==previousTime) return(0);         //EA will not go past this point unless it is a new bar
   previousTime=Time[0];                        // If it was a new bar , it's old now but continue to the end
// if no order open and new bar
   if(myTrades<1)
     {
      if(bar2>1)// if condition met
        {
         //place buy order
         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()); // if returned ticket is -1 OrderSent failed
         return(0);
        }
      // or if conditions for sell met
      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 to start
        }
     }
   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()
  {
   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)OrderClose(OrderTicket(),OrderLots(),Bid,Slip,Blue);
         if(OrderType()==OP_SELL)OrderClose(OrderTicket(),OrderLots(),Ask,Slip,Red);
        }
      //Sleep(1000);
     }
  }
//========================================================================
 
chuale:
Sì, ora può chiudere. grazie GumRai. ora so che il numero di ticket continua a cambiare in base ai tick, quindi come ottenere il numero di ticket dell'ordine aperto? Devo usare OrderTicket() giusto?


Ciao di nuovo Chuale,

Stavo giocando con la tua idea su USDJPY e non sono riuscito a ottenere risultati positivi senza alcuni cambiamenti, ecco un esempio dei miei risultati su USDJPY sul grafico M1:

USDJPY su M1

Hai intenzione di usarlo su una coppia diversa?

L'uscita su bar3 < -1 o bar3 > 1 non ha dato risultati positivi.

 
deVries:

?????? ..... inutile

controlla correttamente quali scambi hai

cercare il giusto simbolo e il giusto magicnumber

con un orderloop potete poi selezionare il trade giusto con cui chiudere

.

con il tuo metodo

si perde il valore del biglietto nel momento in cui si riavvia il pc quindi

fallisce .....


Se intendi che non è il modo migliore per chiudere un ordine sono d'accordo, ma se il tizio non vuole usare OrderSelect (o non sa come farlo) e non lascia nessun ordine aperto nel mercato, funziona.

Qui cerchiamo di aiutarci a vicenda e la tua risposta non è servita a nulla, non gli hai mostrato come usare la funzione Order Select e il suo EA non funziona meglio ora a causa del tuo commento.

La prossima volta che vuoi aiutare, fallo nel modo giusto, metti il codice giusto in modo che gli altri possano effettivamente imparare qualcosa.

 
thrdel:


Ci sono un paio di cose che hai sbagliato. Presumo che tu voglia che questo EA lavori su coppie JPY su time frame M1. Vuoi piazzare gli ordini solo sulla nuova barra e chiudere gli ordini solo sulla nuova barra o vuoi entrare sulla nuova barra e uscire se le condizioni sono soddisfatte? Ecco cosa penso:

Prima contate gli ordini con OrdersTotal().

Poi calcola le tue variabili

Se ci sono ordini nel mercato controlla se devono essere chiusi

Se non ci sono ordini sul mercato, controlla se le condizioni di entrata sono soddisfatte.

Fammi sapere se hai qualche domanda.

Motivazione: