Un operazione per volta!

Sezione dedicata a metatrader (ed altre piattaforme) ed al suo linguaggio di programmazione per il trading automatico
London89
Messaggi: 4
Iscritto il: 21/07/2021, 14:51

Un operazione per volta!

Messaggio da London89 »

ciao a tutti!
Sono un appassionato di trading e ho alcune strategie da automatizzare e infatti da pochi mesi sto studiando il linguaggio MQL4!
qualcuno è cosi gentile da aiutarmi? sto cercando di fare un expert che quando un ordine pendente tocca un prezzo fa una sola operazione al giorno.
Se durante la giornata quel prezzo viene ritoccato l'expert non deve più rientrare anche se l'ordine è stato chiuso.
Vi scrivo il codice:
Soltanto che con questo codice che ho scritto funziona solo su una valuta per volta e vorrei farlo andare su più valute insieme

Codice: Seleziona tutto

int start()
  {
  
double HGrid_Pips = 50.0;

   double dayH = iHigh(NULL, PERIOD_D1, 0);
   double dayL = iLow(NULL, PERIOD_D1,0);
    
   double pipRange=HGrid_Pips *10*Point;
    
 double top1 = (dayH + pipRange) - MathMod(dayH, pipRange);
 double top2 = (dayH + pipRange) - MathMod(dayH, pipRange)+ 500 *Point;
 double bot1 = dayL - MathMod(dayL, pipRange);
 double bot2 = dayL - MathMod(dayL, pipRange)- 500 *Point;
 
  ObjectCreate("topline1",OBJ_HLINE,0,0,top1);
  ObjectCreate("topline2",OBJ_HLINE,0,0,top2);
  ObjectCreate("botline1",OBJ_HLINE,0,0,bot1);
  ObjectCreate("botline2",OBJ_HLINE,0,0,bot2);
 { 
  if (candleHasOrders () == false)
 OrderSend(NULL,OP_SELLLIMIT,0.01,top1,0,top1 + 200 *Point,top1 - 50 *Point,NULL,0,0,clrAliceBlue);
 }
 {
 if (candleHasOrders () == false)
 OrderSend(NULL,OP_SELLLIMIT,0.01,top2,0,top1 + 200 *Point,top2 - 50 *Point,NULL,0,0,clrAliceBlue);
 }
  {
  if (candleHasOrders () == false)
  OrderSend(NULL,OP_BUYLIMIT,0.01,bot1, 0,bot1 - 200 *Point,bot1 + 50 *Point,NULL,0,0,clrAquamarine) ;
  }
  {
  if (candleHasOrders () == false)
  OrderSend(NULL,OP_BUYLIMIT,0.01,bot2, 0,bot2 - 200 *Point,bot2 + 50 *Point,NULL,0,0,clrAquamarine) ;}
 return(0);
 
 }
 bool candleHasOrders(){

   for(int i = 3; i < Bars; i++)                                                                    Ho provato anche con OrdersTotal () soltanto che il risultato non cambia
      if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol())
         if (iBarShift(NULL, PERIOD_D1, OrderOpenTime() , true) == 0)
         return true;  
         
         for(int i2 = 0; i2 < OrdersHistoryTotal(); i2++)
      if(OrderSelect(i2, SELECT_BY_POS, MODE_HISTORY) && OrderSymbol() == Symbol())
         if (iBarShift(NULL, PERIOD_D1, OrderCloseTime(), true) == 0)
            return true;   
        
            return false;

 return false;
 }
Avatar utente
Dainesi
Messaggi: 440
Iscritto il: 12/05/2014, 12:10
Località: Castellanza (VA)

Re: Un operazione per volta!

Messaggio da Dainesi »

Ciao London89,

capisco il voler far da se ma qui è l'approccio programmatico che è sbagliato.
Tu devi effettuare un doppio controllo prima di poter aprire (o inviare) l'ordine al server:
- controllare tra gli ordini aperti
- controllare tra gli ordini chiusi

Il controllo è un ciclo su tutto l'insieme degli ordini e non una sua parte.

Cosa devi controllare? Se esiste un ordine su quel simbolo la cui data di apertura (o immissione) è uguale o superiore a quella della candela giornaliera attuale (la barra zero).
London89
Messaggi: 4
Iscritto il: 21/07/2021, 14:51

Re: Un operazione per volta!

Messaggio da London89 »

Grazie per la risposta! Ma tu sei Daniele Livio Dainesi? Ho comprato il tuo libro e lo consideró molto utile... Non riesci a farmi un esempio con codice? Perché è da pochi mesi che studio il linguaggio ed alcuni concetti non arrivo!
Avatar utente
Dainesi
Messaggi: 440
Iscritto il: 12/05/2014, 12:10
Località: Castellanza (VA)

Re: Un operazione per volta!

Messaggio da Dainesi »

London89 ha scritto: 23/07/2021, 13:58 Grazie per la risposta! Ma tu sei Daniele Livio Dainesi? Ho comprato il tuo libro e lo consideró molto utile... Non riesci a farmi un esempio con codice? Perché è da pochi mesi che studio il linguaggio ed alcuni concetti non arrivo!
Si sono io. :whist: Di seguito ti posto il codice riscritto. Tieni conto che se fossi in te riscriverei la strategia sostituendo i massimi e minimi della candela odierna con i Pivot di giornata che, essendo calcolati sui dati di ieri, non sono soggetti a cambiamenti. :yes:

Codice: Seleziona tutto

//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                              Copyright © 2021, SD Studio DAINESI |
//|                                   http://www.sdStudioDainesi.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2021, SD Studio DAINESI"
#property link      "http://www.sdStudioDainesi.com"
#property version   "1.00"
#property strict

input int       MagicNumber = 100;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
 
double HGrid_Pips = 50.0;

//Attenzione !! Questi valori sono dinamici in quanto riferiti alla barra in corso che è in evoluzione!
double dayH = iHigh(Symbol(), PERIOD_D1, 0); 
double dayL = iLow(Symbol(), PERIOD_D1,0);
    
double pipRange = HGrid_Pips *10*Point;
    
double top1 = (dayH + pipRange) - MathMod(dayH, pipRange);
double top2 = (dayH + pipRange) - MathMod(dayH, pipRange)+ 500 *Point;
double bot1 = dayL - MathMod(dayL, pipRange);
double bot2 = dayL - MathMod(dayL, pipRange)- 500 *Point;
 
//Creazione oggetti grafici (qui andrebbe creata una routine che crea se non ci sono, modifica se esistenti)
//Nel caso di prezzo sui nuovi massimi o su nuovi minimi si rischia di pasticciare il grafico!
ObjectCreate("topline1",OBJ_HLINE,0,0,top1);
ObjectCreate("topline2",OBJ_HLINE,0,0,top2);
ObjectCreate("botline1",OBJ_HLINE,0,0,bot1);
ObjectCreate("botline2",OBJ_HLINE,0,0,bot2);

bool bStop = OpenedOrder();
if(bStop==false)
{
   int iFool = OrderSend(Symbol(),OP_SELLLIMIT,0.01,top1,0,top1 + 200 *Point,top1 - 50 *Point,NULL,0,0,clrAliceBlue);
   iFool = OrderSend(Symbol(),OP_SELLLIMIT,0.01,top2,0,top1 + 200 *Point,top2 - 50 *Point,NULL,0,0,clrAliceBlue);
   iFool = OrderSend(Symbol(),OP_BUYLIMIT,0.01,bot1, 0,bot1 - 200 *Point,bot1 + 50 *Point,NULL,0,0,clrAquamarine);
   iFool = OrderSend(Symbol(),OP_BUYLIMIT,0.01,bot2, 0,bot2 - 200 *Point,bot2 + 50 *Point,NULL,0,0,clrAquamarine);
}

//Cancello i pendenti
if(bStop==true)
{
   for(int i = OrdersTotal()-1; i>=0; i--)
   {
      int iFool = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber && OrderType()>OP_SELL)
      {
         iFool = OrderDelete(OrderTicket());
      }
   }
}

return;

}
//------------------------------------------------------+
bool OpenedOrder()
{

bool result = false;

for(int i = OrdersTotal()-1; i>=0; i--)
{
   int iFool = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
   if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber && OrderType()<=OP_SELL)
   {
      if(OrderOpenTime()>=iTime(Symbol(),PERIOD_D1,0)) 
      {
         result = true;
         break;
      }
   }
}

if(result==false)
{
   for(int i = OrdersHistoryTotal()-1; i>=0; i--)
   {
      int iFool = OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber && OrderType()<=OP_SELL)
      {
         if(OrderOpenTime()>=iTime(Symbol(),PERIOD_D1,0)) 
         {
            result = true;
            break;
         }
      }
   }
}

return(result);

}

Chi c’è in linea

Visitano il forum: CC [Bot] e 0 ospiti