avventure di un principiante - pagina 4

 

Ciao leggende del mql. Ho cucinato lo pseudo codice per voi durante la mia ora di pranzo al lavoro. Eccolo. fatemi sapere cosa manca e lo aggiungerò.

Pseudo codice N&P
Con questa strategia vogliamo avere 1 codice, essere in grado di attaccarlo a qualsiasi grafico, e dovrebbe funzionare su 5 valute, inserendo posizioni sia short che long su ciascuna di esse se le regole sono soddisfatte.
---EURUSD---
Se ema7>ema14>sma50 e PriceNow è < TopFilterLevel (es: 1.3080 per eurusd. Questo lo regolo su base giornaliera) allora:
Compra EURUSD Lotti (i lotti devono essere variabili esterne, ad esempio 0,01). Altrimenti: (cioè condizioni non soddisfatte) non comprare.

Se ema7<ema14<sma50 e PriceNow è > BottomFilterLevel (es: 1.1508 per eurusd) allora:
Short EURUSD Lots (di nuovo, variabile esterna). Else (cioè le condizioni non soddisfatte non shortano).

Se la posizione BUY raggiunge 20 pip dal punto di entrata allora: TAKEPROFIT su EURUSD.
Se la posizione SHORT raggiunge 20 pip dal punto di entrata allora: TAKEPROFIT su EURUSD: TAKEPROFIT su EURUSD.
Se i 20 pip non vengono raggiunti (sia in acquisto che in vendita) allora continua ad essere sul mercato fino a quando la posizione viene chiusa

manualmente. (ideall mettiamo questo nella funzione OrderSend per mantenere il codice più corto).

----GBPUSD---
esattamente lo stesso codice di cui sopra.

----USDJPY---
STESSO CODICE DI SOPRA

---USDCHF---
STESSO COME SOPRA

---AUDUSD---
STESSO COME SOPRA

**Codice specifico
sia le operazioni buy che quelle short possono essere eseguite simultaneamente per qualsiasi valuta se i criteri sopra indicati sono soddisfatti
***nessun stoploss è necessario per questo codice

**nessun codice di gestione del denaro per questo

Allora, come ti sembra questo?

 
niko:

Ciao leggende del mql. Ho cucinato lo pseudo codice per voi durante la mia ora di pranzo al lavoro. Eccolo. fatemi sapere cosa manca e lo aggiungerò.

Pseudo codice N&P
Con questa strategia vogliamo avere 1 codice, essere in grado di attaccarlo a qualsiasi grafico, e dovrebbe funzionare su 5 valute, inserendo posizioni sia short che long su ciascuna di esse se le regole soddisfano.
---EURUSD---
Se ema7>ema14>sma50 e PriceNow è < TopFilterLevel (es: 1.3080 per eurusd. Questo lo regolo su base giornaliera) allora:
Compra EURUSD Lotti (i lotti devono essere variabili esterne, ad esempio 0,01). Altrimenti: (cioè condizioni non soddisfatte) non comprare.

Se ema7<ema14<sma50 e PriceNow è > BottomFilterLevel (es: 1.1508 per eurusd) allora:
Short EURUSD Lots (di nuovo, variabile esterna). Else (cioè le condizioni non soddisfatte non shortano).

Se la posizione BUY raggiunge 20 pip dal punto di entrata allora: TAKEPROFIT su EURUSD.
Se la posizione SHORT raggiunge 20 pip dal punto di entrata allora: TAKEPROFIT su EURUSD: TAKEPROFIT su EURUSD.
Se i 20 pip non vengono raggiunti (sia in acquisto che in vendita) allora continua ad essere sul mercato fino a quando la posizione viene chiusa

manualmente. (ideall mettiamo questo nella funzione OrderSend per mantenere il codice più corto).

----GBPUSD---
esattamente lo stesso codice di cui sopra.

----USDJPY---
STESSO CODICE DI SOPRA

---USDCHF---
STESSO COME SOPRA

---AUDUSD---
STESSO COME SOPRA

**Codice specifico
sia le operazioni buy che quelle short possono essere eseguite simultaneamente per qualsiasi valuta se i criteri sopra indicati sono soddisfatti
***non è necessario alcuno stoploss per questo codice

**nessun codice di gestione del denaro per questo

Allora, come ti sembra questo?

Ehi ragazzi, il tutorial di base sulla codifica mi ha davvero aiutato a capire questo (anche se la parte di codifica dettagliata è carente). Per dimostrarvi che mi sono dato da fare, ho allegato il codice qui sotto. L'idea penso sia lì, ma restituisce ancora un sacco di errori. Vedrete che tutto è sotto una grande parentesi in Start() la ragione per cui l'ho fatto è che mql continuava a tornare con l'errore che la variabile non può essere dichiarata globalmente, e quando ho fatto tutto in una parentesi sembra aver fermato quell'errore (anche se molti altri errori sono rimasti). Ho usato notepad++ per controllare l'allineamento delle parentesi. Quindi ho almeno preso la strada giusta con questo?

//+------------------------------------------------------------------+
//|                                     N&P 1DailyUpTrendExec.mq4 |
//| Copyright Nick Lou & Pete Arh 2009                               |
//|                                     20090523                     |
//|                                                                  |
//+------------------------------------------------------------------+

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+


   //-------------------Declaring All Variables and Conditions


//--------------------declaration end


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


   // Order counting code
   // Return:  0 = no orders
   //          >0 = # long orders
   //          <0 = # short orders
      int CalcOpenOrders()
         {
         int long=0,short=0;
      for(int i=0; i<OrdersTotal(); i++)   
         //i set to 0 to stop bugs from
         //crawling in, i<Orderstotal means if i is behind the number of orders
         //in market then start counting orders and make i that number
         {
         if(OrderSelect( i, SELECT_BY_POS, MODE_TRADES)==false)break;
         //this function selects an order for further processing
         if(OrderType()==OP_BUY)long++;
         if(OrderType()==OP_SELL)short++;
         }
      if(long>0)return(long);
      if(short>0)return(-short);
      }

//------------ (fingers crossed this is right). I still don't get it why we need to count orders.


//--------------DECLARATION OF VARIABLES-------------------------
double ema1, ema2, ema3, closeup, e1over2, e2over3, e1under2, e2under3,
eurusdbuyok, eurusdshortok;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ()
   {
   ema1= iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,0);
   ema2= iMA(NULL,0,14,0,MODE_EMA,PRICE_CLOSE,0);
   ema3= iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);
   e1under2= ema1< ema2;
   e2under3= ema2< ema3;
   e1over2= ema1> ema2;
   e2over3= ema2> ema3;

   if(Bars<75)
      {
      Print("Bars less than 100");
      return(0);
      }


   //------------------EURUSD Block-------------------------
   //check order type, if it doesn't equal to buy already then buy


   //here i am setting a condition which will be
   //checked before a trade is opened, it shoudl state 'It's okay to enter
   //into long trade so long as there is either 1 order in place already or
   //none)
  
   // Call function. the returnvalue (output) of the function is stored into ReturnVal
   int ReturnVal = CalcOpenOrders();
  
   // Check output of function
   if ( ReturnVal >0)  // >0 = long orders. See CalcOpenOrders() 
      eurusdbuyok=1;
      else
      {
      eurusdbuyok=0;
      return(0);
      }

   if ( ReturnVal<0)   // <0 = short orders. See CalcOpenOrders()
      eurusdshortok=1;
      else
      {
      eurusdshortok=0;
      return(0);
      }


   //--------------condition ends

   if( eurusdshortok==1)
      {
      static int ticket;
      // deleted if(OrdersTotal()==0)
      if( e1under2 && e2under3)     // short function
         {
         ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"ShortOrder ",0,0,Red);
         if( ticket>0)
            {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
            Print("SHORT order opened : ",OrderOpenPrice());
            }
         }
      return(0);
      }



   //  -------------------------------------------------------------------------------------------
   if ( eurusdbuyok==1)
      {
      static int ticket1;
      // deleted if(OrdersTotal()==0)
      if( e1over2 && e2over3 && eurusdbuyok==1) //buy function
         {
         ticket1=OrderSend(Symbol(),OP_BUY, Lots,Ask,0,0,Ask+ TakeProfit*Point,"",0,0,Green);
         //What's 12345 for? I ADDED ASk-30*Point for stop loss
         if( ticket1>0)
            {
            if(OrderSelect( ticket1, SELECT_BY_TICKET, MODE_TRADES))
            Print("BUY order opened : ",OrderOpenPrice());
            }
         }
      return(0);
      }

   return(0);
   } 
Questa è l'ultima versione del codice. sintatticamente tutto sembra essere ok, ma quando lo eseguo attraverso strategy tester non restituisce alcun trade. qualcosa è sbagliato nella logica. ho bisogno di aiuto. Sto diventando abbastanza familiare con il codice ora, bene la struttura del lato del programma di esso.
 
niko wrote >>

Ciao leggende del mql. Ho cucinato lo pseudo codice per voi durante la mia ora di pranzo al lavoro. Eccolo. fatemi sapere cosa manca e lo aggiungerò.

Pseudo codice N&P
Con questa strategia vogliamo avere 1 codice, essere in grado di attaccarlo a qualsiasi grafico, e dovrebbe funzionare su 5 valute, inserendo posizioni sia short che long su ciascuna di esse se le regole sono soddisfatte.
---EURUSD---
Se ema7>ema14>sma50 e PriceNow è < TopFilterLevel (es: 1.3080 per eurusd. Questo lo regolo su base giornaliera) allora:
Compra EURUSD Lotti (i lotti devono essere variabili esterne, ad esempio 0,01). Altrimenti: (cioè condizioni non soddisfatte) non comprare.

Se ema7<ema14<sma50 e PriceNow è > BottomFilterLevel (es: 1.1508 per eurusd) allora:
Short EURUSD Lots (di nuovo, variabile esterna). Else (cioè le condizioni non soddisfatte non shortano).

Se la posizione BUY raggiunge 20 pip dal punto di entrata allora: TAKEPROFIT su EURUSD.
Se la posizione SHORT raggiunge 20 pip dal punto di entrata allora: TAKEPROFIT su EURUSD: TAKEPROFIT su EURUSD.
Se i 20 pip non vengono raggiunti (sia in acquisto che in vendita) allora continua ad essere sul mercato fino a quando la posizione viene chiusa

manualmente. (ideall mettiamo questo nella funzione OrderSend per mantenere il codice più corto).

----GBPUSD---
esattamente lo stesso codice di cui sopra.

----USDJPY---
STESSO CODICE DI SOPRA

---USDCHF---
STESSO COME SOPRA

---AUDUSD---
STESSO COME SOPRA

**Codice specifico
sia le operazioni buy che quelle short possono essere eseguite simultaneamente per qualsiasi valuta se i criteri sopra indicati sono soddisfatti
***nessun stoploss è necessario per questo codice

**nessun codice di gestione del denaro per questo

Allora, come ti sembra questo?

Ciao Niko

Il tuo pseudo codice sembra abbastanza buono per un primo tentativo.

Vorrei però vederlo un po' più strutturato e ci sono un paio di domande che mi fa sorgere.

Sono stato in grado di metterlo facilmente e rapidamente nel tipo di formato che userei tipicamente io stesso. È allegato qui come file di testo perché possiate darci un'occhiata. Avrete bisogno di salvare questo file e aprirlo in notepad o un editor simile per vedere la formattazione.

Notate che in questa fase non stiamo scrivendo in nessun linguaggio informatico specifico. Stiamo solo cercando di specificare chiaramente e senza ambiguità quello che stiamo cercando di fare.

Si può notare che lo pseudocodice è abbastanza specifico e "legalistico". Questo è il modo in cui dobbiamo parlare ai computer. Dobbiamo specificare molto chiaramente cosa vogliamo che facciano. Altrimenti hanno la tendenza a generare spazzatura.

Noterete anche l'uso di "Blocchi" per organizzare le cose in gruppi logici. Questi possono essere utili in seguito per aiutarci a strutturare correttamente il codice. Come qualcuno ha sottolineato prima in questa discussione, non lo facciamo solo per divertimento. Lo facciamo per rendere il codice più leggibile, più comprensibile, più mantenibile e infine più affidabile e privo di bug. La seconda è estremamente importante in un software che sta per essere usato per il trading dal vivo, a meno che, naturalmente, non abbiate secchiate di denaro che siete disposti a buttare via :) . Seriamente, il trading è già abbastanza difficile senza avere a che fare anche con un software difettoso.

Per favore, dai un'occhiata a quello che ti ho mandato e sentiti libero di fare qualsiasi cambiamento che ritieni necessario. Ci sono un paio di punti importanti che mancano nel mio pseudo codice. Puoi individuarli?

Potresti anche occuparti delle due domande che ho sollevato nello pseudocodice. Un certo numero di altre domande mi vengono in mente, ma queste possono essere meglio lasciate fino alla fase di codifica vera e propria.

Se non l'hai già fatto, potresti provare l'editor Notepad++ che FXtrader2008 ha menzionato prima in questa discussione. Usa qualsiasi strumento che puoi trovare per rendere la vita un po' più facile. Per favore, inviami il tuo pseudocodice rivisto come allegato a un file di testo. Trovo che cercare di scrivere codice strutturato, pseudo o altro, in questo editor HTML sia un po' noioso e disordinato.

Saluti

Tim

File:
 
TSWilson:

Ciao Niko

Il tuo pseudo codice sembra abbastanza buono per un primo tentativo.

Mi piacerebbe però vederlo un po' più strutturato e ci sono un paio di domande che mi fa sorgere.

Sono stato in grado di metterlo facilmente e rapidamente nel tipo di formato che userei tipicamente io stesso. È allegato qui come file di testo perché possiate darci un'occhiata. Avrete bisogno di salvare questo file e aprirlo in notepad o un editor simile per vedere la formattazione.

Notate che in questa fase non stiamo scrivendo in nessun linguaggio informatico specifico. Stiamo solo cercando di specificare chiaramente e senza ambiguità quello che stiamo cercando di fare.

Si può notare che lo pseudocodice è abbastanza specifico e "legalistico". Questo è il modo in cui dobbiamo parlare ai computer. Dobbiamo specificare molto chiaramente cosa vogliamo che facciano. Altrimenti hanno la tendenza a generare spazzatura.

Noterete anche l'uso di "Blocchi" per organizzare le cose in gruppi logici. Questi possono essere utili in seguito per aiutarci a strutturare correttamente il codice. Come qualcuno ha sottolineato prima in questa discussione, non lo facciamo solo per divertimento. Lo facciamo per rendere il codice più leggibile, più comprensibile, più mantenibile e infine più affidabile e privo di bug. La seconda è estremamente importante in un software che sta per essere usato per il trading dal vivo, a meno che, naturalmente, non abbiate secchiate di denaro che siete disposti a buttare via :) . Seriamente, il trading è già abbastanza difficile senza avere a che fare anche con un software difettoso.

Per favore, dai un'occhiata a quello che ti ho mandato e sentiti libero di fare qualsiasi cambiamento che ritieni necessario. Ci sono un paio di punti importanti che mancano nel mio pseudo codice. Puoi individuarli?

Potresti anche occuparti delle due domande che ho sollevato nello pseudocodice. Un certo numero di altre domande mi vengono in mente, ma queste possono essere meglio lasciate fino alla fase di codifica vera e propria.

Se non l'hai già fatto, potresti provare l'editor Notepad++ che FXtrader2008 ha menzionato prima in questa discussione. Usa qualsiasi strumento che puoi trovare per rendere la vita un po' più facile. Per favore, inviami il tuo pseudocodice rivisto come allegato a un file di testo. Trovo che cercare di scrivere codice strutturato, pseudo o altro, in questo editor HTML sia un po' noioso e disordinato.

Saluti

Tim

Ehi TSW. Grazie per questo. Posso vedere che hai messo un bel po' di tempo in questo, quindi lo apprezzo molto. Ho allegato lo pseudo codice aggiornato, ma nel caso non si sia allegato, eccolo qui sotto. Ho provato a vedere cosa ti è sfuggito, ma non sono riuscito a capirlo, alcune cose le ho aggiunte ma erano solo chiarimenti di cose.


Dove andiamo da qui? Mentre stiamo creando questo codice "corretto", sto ancora cercando di risolvere il puzzle del codice di cui sopra. Non segue il nostro pseudocodice perché è un vecchio codice rattoppato, ma sono ancora abbastanza perplesso perché dovrebbe funzionare, almeno per 1 valuta. La cosa fondamentale è che costruirlo in questo modo disordinato e non organizzato mi sta insegnando i veri elementi di codifica (come le parentesi graffe influenzano lo script, dove dichiarare le variabili, ecc). Qualche idea sul perché il codice non funziona così com'è ora?

Program Title  - N&P Pseudo Code

START BLOCK - List of Currency Pairs

     EURUSD
     GBPUSD
     USDJPY
     USDCHF
     AUDUSD

END BLOCK - List Of Currency Pairs



START BLOCK - Configuration Parameters

      Set the value of TopFilterLevel manually on a daily basis for EURUSD
      Set the value of BottomFilterLevel manually on a daily basis EURUSD
      Set the value of TopFilterLevel manually on a daily basis for GBPUSD
      Set the value of BottomFilterLevel manually on a daily basis GBPUSD

      Set the value of TopFilterLevel manually on a daily basis for USDJPY
      Set the value of BottomFilterLevel manually on a daily basis USDJPY
      Set the value of TopFilterLevel manually on a daily basis for USDCHF
      Set the value of BottomFilterLevel manually on a daily basis USDCHF

      Set the value of TopFilterLevel manually on a daily basis for AUDUSD
      Set the value of BottomFilterLevel manually on a daily basis AUDUSD

      Set Lot size manually for All positions at once (same lot size)

END BLOCK - Configuration Parameters



START BLOCK  - Entry Rules

     If   the 7 Period Exponential Moving Average is greater than the 14 Period Exponential Moving Average  AND
          the 14 Period Exponential Moving Average is greater than the  50 period Simple Moving Average       AND
          Current Price   is less than TopFilterLevel  THEN
                       Signal a  BUY (Long) entry condition

     If   the  7 Period Exponential Moving Average is less than 14 Period Exponential Moving Average  AND
          the 14 Period Exponential Moving Average is less than the 50 period Simple Moving Average       AND
          Current Price   is less than  BottomFilterLevel  THEN
                       Signal a  SELL (Short) entry condition

     ***  Question ***
      What time periods do you want to use for your moving averages? Are the periods  Minutes, Hours, Days, Weeks, Months or  do they need to be variable?
***Answer *** Excellent question. It will be 5 minute periods for all moving averages, they do not need to be variable.

END BLOCK - Entry Rules
      


START BLOCK - Manual Close

      **** Question ***
      You say 
                  "Keep being in the market until the position is closed manually.
                   (ideall we put this into OrderSend function to keep code shorter)."
       
       What exactly do you want the program to do in this block?

***I was unclear on this before, my apologies. There should be no block as this in the code. I will exit positions manually when needed through the trade/terminal window (I assume that’s possible and won’t mess up the EA execution, right). So actually I don’t know if we need to code this flexibility or not? What do you think

END BLOCK - Manual Close  



START BLOCK  - Exit Rules

     If  any Open Position is greater than or equal to 20 pips from the entry level THEN
        Close the Position

END BLOCK  - Exit Rules



START BLOCK - Main  - This block controls the whole flow of the program
         With each Currency Pair in the List of Currency Pairs block do all of the following

                  Process the Exit Rules Block - 
                                    (Note that in practice this would normally just be the automatic execution of a Take Profit  Stop
                                    but we should mention it here in the pseudo code for completness. Of course you may have something else in mind
                                    such as using the program to close an open position—nope not for this code.)
                  Check the Entry Rules block  to see if a BUY or SELL  condition exists for this Currency Pair 

                  Check to see if  there is already  an open  BUY  position for this Currency Pair
                  Check to see if  there is already  an open SELL  position for this Currency Pair

                  If there is no open BUY position  for this currency pair   AND
                      a Buy condition exixts for this currency pair THEN
                              Open a BUY Position  for this currency pair
				Size: Pre-determined Lots

ELSE		If there is already 1 open BUY position for this currency pair		DO NOT OPEN BUY Position for this currency pair.

                   If there is no open SELL position  for this currency pair   AND
                      a SELL condition exixts for this currency pair THEN
                              Open a SELL Position  for this currency pair 
				Size predetermined lots.
  
ELSE		If there is already 1 sell position open for this currency pair		Do not open SELL Positions for this currency pair     
              
END BLOCK - Main 




PS: I will often use just 1 direction on a currency pair (eg: just short, for eurusd for 2 days for instance). How could we build this into the code. My assumption is I could just put ‘//’ infront of the parts of the code I don’t want to use (Eg: infront of buy or sell orders within each currency pair) and then remove them when I need to use that part of code next time. Will this work with a code structured in this way? 

**I can’t really think of anything you left out on purpose, to be honest. Unless it’s to check if there are sufficient funds for the trade, but that’s not necessary yet. Maybe in future versions of the strategy.
 
niko wrote >>

Ehi ragazzi, il tutorial di base sulla codifica mi ha davvero aiutato a mettere la testa a posto (anche se la parte di codifica dettagliata è carente). Per dimostrarvi che mi sono dato da fare, ho allegato il codice qui sotto. L'idea penso sia lì, ma restituisce ancora un sacco di errori. Vedrete che tutto è sotto una grande parentesi in Start() la ragione per cui l'ho fatto è che mql continuava a tornare con l'errore che la variabile non può essere dichiarata globalmente, e quando ho fatto tutto in una parentesi sembra aver fermato quell'errore (anche se molti altri errori sono rimasti). Ho usato notepad++ per controllare l'allineamento delle parentesi. Quindi ho almeno preso la strada giusta con questo?

Questa è l'ultima versione del codice. sintatticamente tutto sembra essere ok, ma quando lo eseguo attraverso strategy tester non restituisce alcun trade. qualcosa è sbagliato con la logica. bisogno di aiuto. Sto diventando abbastanza familiare con il codice ora, bene la struttura del lato del programma di esso.

Ehi ragazzi/e, qualsiasi aiuto con il pezzo di codice di cui sopra (non lo pseudo codice ma il codice del codice) mentre sto imparando come farlo nel modo giusto.

Ho avuto un brainstorming oggi, penso che forse l'errore è che c'è una funzione che conta gli ordini, e invece forse ho bisogno di 2 funzioni separatamente, una conta gli acquisti e un'altra le vendite. Ho programmato il codice qui sotto (ho cambiato alcune cose per tenere conto di questo), potete vedere qui sotto. Ma è ancora tutto incasinato perché sono ancora un principiante assoluto. Qualche idea su questo?

//+------------------------------------------------------------------+
//|                                     N&P 1DailyUpTrendExec.mq4 |
//| Copyright Nick Lou & Pete Arh 2009                               |
//|                                     20090523                     |
//|                                                                  |
//+------------------------------------------------------------------+

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+


  //-------------------Declaring All Variables and Conditions


//--------------------declaration end


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


  // Order counting code
  // Return:  0 = no orders
  //          >0 = # long orders
  //          <0 = # short orders
     int CalcOpenOrders()
        {
        int long=0,short=0;
     for(int i=0;i<OrdersTotal();i++)
        //i set to 0 to stop bugs from
        //crawling in, i<Orderstotal means if i is behind the number of orders
        //in market then start counting orders and make i that number
        {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)break;
        //this function selects an order for further processing
        if(OrderType()==OP_BUY)long++;
        if(OrderType()==OP_SELL)short++;
        }
     if(long>0)return(long);
     if(short>0)return(-short);
     }

//------------ (fingers crossed this is right). I still don't get it
why we need to count orders.


//--------------DECLARATION OF VARIABLES-------------------------
double ema1,ema2,ema3,closeup, e1over2, e2over3, e1under2, e2under3,
eurusdbuyok, eurusdshortok;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ()
  {
  ema1= iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,0);
  ema2= iMA(NULL,0,14,0,MODE_EMA,PRICE_CLOSE,0);
  ema3= iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);
  e1under2=ema1<ema2;
  e2under3=ema2<ema3;
  e1over2=ema1>ema2;
  e2over3=ema2>ema3;

  if(Bars<75)
     {
     Print("Bars less than 100");
     return(0);
     }


  //------------------EURUSD Block-------------------------
  //check order type, if it doesn't equal to buy already then buy


  //here i am setting a condition which will be
  //checked before a trade is opened, it shoudl state 'It's okay to enter
  //into long trade so long as there is either 1 order in place already or
  //none)

  // Call function. the returnvalue (output) of the function is
stored into ReturnVal
  int ReturnVal = CalcOpenOrders();

  // Check output of function
  if (ReturnVal >0)  // >0 = long orders. See CalcOpenOrders()
     eurusdbuyok=1;
     else
     {
     eurusdbuyok=0;
     return(0);
     }

  if (ReturnVal<0)   // <0 = short orders. See CalcOpenOrders()
     eurusdshortok=1;
     else
     {
     eurusdshortok=0;
     return(0);
     }


  //--------------condition ends

  if(eurusdshortok==1)
     {
     static int ticket;
     // deleted if(OrdersTotal()==0)
     if(e1under2 && e2under3)     // short function
        {
        ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point,"ShortOrder
",0,0,Red);
        if(ticket>0)
           {
           if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
           Print("SHORT order opened : ",OrderOpenPrice());
           }
        }
     return(0);
     }



  //  -------------------------------------------------------------------------------------------
  if (eurusdbuyok==1)
     {
     static int ticket1;
     // deleted if(OrdersTotal()==0)
     if(e1over2 && e2over3 && eurusdbuyok==1) //buy function
        {
        ticket1=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,Green);
        //What's 12345 for? I ADDED ASk-30*Point for stop loss
        if(ticket1>0)
           {
           if(OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES))
           Print("BUY order opened : ",OrderOpenPrice());
           }
        }
     return(0);
     }

  return(0);
  }

 
niko wrote >>

Ehi ragazzi/e, qualche aiuto per il codice di cui sopra (non lo pseudo codice ma il codice del codice) mentre sto imparando a farlo nel modo giusto.

Ho avuto un brainstorming oggi, penso che forse l'errore è che c'è una funzione che conta gli ordini, e invece forse ho bisogno di 2 funzioni separatamente, una conta gli acquisti e un'altra le vendite. Ho programmato il codice qui sotto (ho cambiato alcune cose per tenere conto di questo), potete vedere qui sotto. Ma è ancora tutto incasinato perché sono ancora un principiante assoluto. Qualche idea su questo?

Ciao Niko

Con riferimento allo pseudo codice

Dal codice:
*** Domanda ***
Quali periodi di tempo vuoi usare per le tue medie mobili? I periodi sono minuti, ore, giorni, settimane, mesi o devono essere variabili?
***Risposta *** Ottima domanda. Saranno periodi di 5 minuti per tutte le medie mobili, non hanno bisogno di essere variabili.

Quindi suggerirei di aggiungere allo pseudocodice nell'area dei parametri di configurazione una dichiarazione del tipo

"Usa il time frame a 5 minuti per gli indicatori"


Hai detto:
***Non sono stato chiaro su questo prima, le mie scuse. Non ci dovrebbe essere nessun blocco come questo nel codice.

Uscirò manualmente dalle posizioni quando necessario attraverso la finestra del trade/terminale

(presumo che questo sia possibile e che non incasini l'esecuzione dell'EA, giusto).

Quindi in realtà non so se è necessario codificare questa flessibilità o no? Cosa ne pensi


Suggerisco quindi di eliminare questo blocco dallo pseudo codice.

Non ci dovrebbero essere problemi a codificare l'EA in modo da poter usare il terminale per chiudere manualmente una posizione senza incasinare nulla.

Hai aggiunto queste righe:

ELSE Se c'è già 1 posizione BUY aperta per questa coppia di valute NON APRIRE una posizione BUY per questa coppia di valute.

ELSE Se c'è già 1 posizione di vendita aperta per questa coppia di valute non aprire posizioni di VENDITA per questa coppia di valute


*** Domanda *** Perché hai bisogno di dichiarare specificamente ciò che NON vuoi che il programma faccia dopo che le linee precedenti hanno appena

dichiarate ciò che volete che il programma faccia. A mio parere lo pseudocodice è il luogo dove pensare attentamente alla vostra logica. Altrimenti è probabile che

diventano un casino quando si inizia la codifica vera e propria.


Hai detto:
PS: Spesso userò solo 1 direzione su una coppia di valute (es: solo short, per eurusd per 2 giorni per esempio). Come potremmo costruire questo nel codice. La mia supposizione è che potrei semplicemente mettere '//' davanti alle parti del codice che non voglio usare (es: davanti agli ordini di acquisto o vendita all'interno di ogni coppia di valute) e poi rimuoverle quando ho bisogno di usare quella parte di codice la prossima volta. Questo funzionerà con un codice strutturato in questo modo?


Commentare il codice come suggerisci non è un modo molto elegante di procedere. Inoltre, se si commenta, ad esempio, la sezione "LONG" del codice, si dovrebbe commentare la funzione per l'apertura di posizioni lunghe per tutte le coppie di valute, a meno che non si produca codice con un sacco di duplicazioni. Anche questo non è un modo molto elegante di procedere e porta facilmente ad errori.

In un dato periodo potresti voler essere lungo EURUSD, corto GBPUSD e non negoziare affatto USDCHF. Questo è abbastanza facile da realizzare, ma mi piacerebbe vederti provare a capire come descriverlo da solo nello pseudo codice.


Ecco un paio di suggerimenti su un possibile modo di procedere.

1. dai un'occhiata a come sono impostati e impiegati i tuoi livelli

2. I livelli sono rappresentati come numeri decimali. Per situazioni go/no go è una pratica comune usare un altro tipo di rappresentazione conosciuta come booleana o flag. Sarebbe possibile usare le bandiere per realizzare quello che vuoi fare?


Avete detto:

**Non riesco a pensare a nulla che tu abbia lasciato fuori di proposito, ad essere onesti. A meno che non sia per controllare se ci sono fondi sufficienti per il trade, ma questo non è ancora necessario.

Forse nelle future versioni della strategia.


No, non si tratta di controllare se i fondi sono sufficienti. Hai detto specificamente che non si tratta di gestione del denaro, tranne ovviamente per specificare la dimensione del lotto. È qualcosa di molto più fondamentale.

Di quali informazioni hai bisogno per piazzare un ordine? Dove e come sono descritti e gestiti questi elementi nel codice psuedo?


Lei ha detto:

Dove andiamo da qui? Mentre stiamo creando questo codice "corretto", sto ancora cercando di risolvere il puzzle del codice di cui sopra. Non segue il nostro pseudo-codice perché è un vecchio codice rattoppato, ma sono ancora abbastanza perplesso perché dovrebbe funzionare, almeno per 1 valuta. La cosa fondamentale è che costruirlo in questo modo disordinato mi sta insegnando i veri elementi di codifica (come le parentesi graffe influenzano lo script, dove dichiarare le variabili, ecc). Qualche idea sul perché il codice non funziona così com'è ora?


Apprezzo la tua frustrazione. Ho dato un'occhiata molto veloce al vecchio codice ma francamente quello che stai cercando di fare non ha molto senso logicamente. Potrei riscrivere questo pezzo di codice in circa 15 minuti e farebbe quello che vuoi, ma non è questo il punto, vero? Hai detto che volevi imparare a scrivere codice. Sto cercando di insegnarti come farlo da solo.


Nico, non penso che tu sia troppo lontano dall'iniziare a scrivere del (nuovo) codice vero e proprio, ma è importante ottenere prima la maggior parte del "cosa vuoi fare" accuratamente inchiodato nello pseudo codice.

Renderà la codifica "sooo much easier" come vedrete presto.


Continua il buon lavoro

Saluti

Tim

 

Ciao Tim,


Come sempre apprezzo molto il tuo tempo con me. Andrò avanti e modificherò lo pseudo codice in modo che rifletta i tuoi commenti. Riguardo al codice reale, non preoccuparti, facciamolo correttamente (sono solo un po' impaziente a volte :), perché imparare è più potente di qualsiasi altra cosa.

 

Ciao Tim,


Ho rivisto lo pseudocodice e ho fatto tutto quello che il mio cervello da principiante poteva capire a questo punto. Lo trovi in allegato, aspetto i tuoi commenti!

 
niko wrote >>

Ciao Tim,

Ho rivisto lo pseudocodice e ho fatto tutto quello che il mio cervello da principiante poteva capire a questo punto. Lo trovi in allegato, attendo con ansia i tuoi commenti!

Ciao Nick

È tutto molto bello.

Ho esaminato il tuo ultimo codice psuedo e ho risposto ad alcune domande, ecc.

Penso che siamo quasi pronti per iniziare a codificare.


Come regola empirica molto approssimativa si dice che 1/3 del tempo di programmazione dovrebbe essere speso per le specifiche, 1/3 per la codifica e 1/3 per il debug e i test.


Quindi possiamo dire che ora siamo all'incirca a 1/3 della strada attraverso questo piccolo progetto!

Ora parliamo del linguaggio MT4.


Tutti i linguaggi informatici hanno modi specifici (un formato) in cui il linguaggio deve essere scritto in modo che il computer possa capire ciò che si sta cercando di istruire a fare. Questo e altre informazioni specifiche del linguaggio si scoprono dalla documentazione. La documentazione per MT4 è disponibile on line su questo forum. Se non l'hai ancora fatto, ti suggerirei di passare un po' di tempo a dare un'occhiata al tipo di informazioni che sono disponibili nella documentazione. Poi, quando avrete bisogno di informazioni su qualche argomento o funzione specifica, saprete dove cercarle.


Per rendere la vita un po' più facile, molti linguaggi di calcolo moderni, tra cui MT4, utilizzano modelli che impostano un layout di base del programma per voi. Questi programmi template sono spesso chiamati "wizard". Troverete il wizard EA sotto la voce di menu "Nuovo" nel MetatEditor con la croce verde su di esso.


Se lo aprite, troverete un modello per "Expert Advisor". Selezionalo e ti verrà richiesto il nome dell'EA, i dettagli dell'autore ecc. e i parametri. I parametri possono essere aggiunti o modificati in seguito, ma in questa fase potresti voler inserire i parametri dal blocco di configurazione.

Ti sarà richiesto di dare ad ogni parametro un nome, un tipo e un valore iniziale


I nomi dei parametri dovrebbero sempre essere descrittivi di ciò che sono


per esempio EURUSD_TopFilterLevel è un nome significativo ex1 IS NOT. L'uso di nomi di dati significativi rende il programma molto più facile da capire il debug o modificare in seguito. Si noti che in MT4, i nomi dei dati sono sensibili alle maiuscole e alle minuscole. LOTSize non è lo stesso di LotSize. È necessario essere attenti e coerenti con i nomi dei dati.


Vi sarà anche richiesto di specificare un tipo di dati (type) per ogni parametro. MT4 utilizza solo 4 tipi di dati Integer Number (int), Decimal Number (double), Text (string) e True / False o Flag (bool) .


Anche in questo caso dobbiamo stare attenti ai tipi di dati e non mischiarli inconsapevolmente o possiamo introdurre sottili bug.


Una volta che avete creato il vostro modello con la procedura guidata vi suggerirei di iniziare a "strutturare" il vostro programma. L'unità di base della struttura in MT4 è la FUNZIONE.


La funzione di base più semplice, che come è scritto qui, in realtà non fa nulla è -



void La mia funzione di base()

{

}


Il template generato dalla metatrader wizard ha già tre funzioni vuote.



int init()

{

return(0)

}



init deinit()

{

return(0)

}



int start()

{

return(0)

}


La funzione init viene chiamata ogni volta che l'EA si avvia quando lo si trascina su un grafico e si clicca sul pulsante Expert advisor ON

La funzione deinit viene chiamata ogni volta che l'EA si ferma quando lo si trascina da un grafico o si clicca sul pulsante Expert advisor OFF


La funzione avvia viene chiamata su OGNI NUOVO TICK ricevuto dal grafico a cui è collegata. Questo significa che può essere chiamato più volte o più volte al minuto a seconda di quanto è impegnato il mercato. È da qui che faremo la maggior parte del nostro lavoro.


Per il momento vi suggerisco di mettere tutto lo pseudo codice del blocco principale nella funzione start e poi commentare lo pseudo codice con // su ogni linea.


Poi create una nuova funzione per il blocco delle regole di ingresso e commentate lo pseudo codice nello stesso modo.


Lasciate le funzioni init e deint vuote e come sono per il momento.


Dovreste essere in grado di compilare questo codice senza errori, ma naturalmente in questa fase non farà nulla.


Continua a lavorare bene!


Saluti

Tim

(PS possiamo parlare su skype se necessario, ma vediamo come va con il forum per il momento)

 

Ciao Tim,

Come sempre il tuo aiuto e il tuo tempo sono estremamente preziosi! Come gesto di ringraziamento vorrei mandarti una bella bottiglia di champaigne una volta che abbiamo finito il processo di codifica.

Sì, ho letto il libro mql un bel po' di volte, la difficoltà era mettere in pratica la teoria. Ho anche stampato circa 10 EA pubblicati su questo sito, per vedere come le cose sono codificate e messe insieme, per cercare di capirle. E passo molto tempo nel simulatore trader su MT4 (cioè facendo backtesting e imparando gli EA già esistenti).

Inizierò il processo di codifica, e farò dei blocchi molto chiari e separati per aiutare entrambi a vedere cosa sta succedendo. E ve li invierò tramite il forum.

1 Domanda: Hai detto che i broker hanno messo delle cose per fermare il pipping aggressivo. 1. Come definite il pipping aggressivo? 2. Quali cose mettono in atto?

Io facevo scalping manuale di eurusd su timeframe 1min (con un metodo di spreadbetting), questo stava andando molto bene fino a quando il brockerage è intervenuto e ha iniziato a mettere dei ritardi per l'esecuzione (entrata e uscita). Quindi ora non ha alcun senso fare questo con questo brokeraggio, anche se è illegale, i ritardi accadranno comunque e incasineranno l'intera giornata (come se di solito fai scalping solo per 1 ora, 2 ritardi e hai perso il tempo prezioso). Ho ottenuto tutti i soldi indietro per i trade in ritardo dopo aver minacciato aggressivamente un'azione legale.

2 Domanda: Usate diversi broker? Quali broker consiglieresti? (se vi è permesso menzionare i nomi qui)

grazie,

nick