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
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 |//| |//+------------------------------------------------------------------+externdouble Lots=0.01;externdouble TakeProfit=20;//+------------------------------------------------------------------+//| expert initialization function |//+------------------------------------------------------------------+//-------------------Declaring All Variables and Conditions//--------------------declaration endint init(){return(0);}//+------------------------------------------------------------------+//| expert deinitialization function |//+------------------------------------------------------------------+int deinit(){return(0);}// Order counting code// Return: 0 = no orders// >0 = # long orders// <0 = # short ordersint CalcOpenOrders(){intlong=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 processingif(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 ReturnValint ReturnVal = CalcOpenOrders();// Check output of functionif( 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 endsif( eurusdshortok==1){staticint 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){staticint 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 lossif( 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.
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.
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.
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);
}
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.
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.
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!
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)
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)
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 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?
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.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
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?
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); }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!
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 è -
Il template generato dalla metatrader wizard ha già tre funzioni vuote.
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