avventure di un principiante - pagina 3

 
niko:

Grazie cloudbreaker! Questo sta iniziando a rendere un po' più divertente, non sapevo che si può chiamare una funzione all'interno di un ritorno (anche se probabilmente è nel libro mql, proprio come tutto il resto teorico). Bello l'elicottero EC 155! Perché 'per fortuna', non vuoi un elicottero tuo?

Domanda Aero HC2:


Ho 3 script per la mia strategia finora. 2 sono unidirezionali, 1 è bidirezionale (che è quello su cui stiamo lavorando qui).

Dalla tua esperienza con MT4, dovrei aspettarmi seri problemi se collego diversi script a 5 o più coppie sullo schermo (1 script per coppia). Sarà più facile per me che programmare o cambiare 1 grande script e fare in modo che quello scelga la coppia che voglio (poiché ciò richiederebbe un cambiamento quotidiano nel codice)?

 
niko:

Domanda Aero HC2:


Ho 3 script per la mia strategia finora. 2 sono unidirezionali, 1 è bidirezionale (che è quello su cui stiamo lavorando qui).

Dalla tua esperienza con MT4, dovrei aspettarmi seri problemi se collego diversi script a 5 o più coppie sullo schermo (1 script per coppia). Sarà più facile per me che programmare o cambiare 1 grande script e fare in modo che quello scelga la coppia che voglio (poiché ciò richiederebbe un cambiamento quotidiano nel codice)?

Supponendo qui che stiamo parlando di una singola strategia di trading attraverso le coppie di valute:-

Preferisco rendere i miei EAs pair-agnostic - cioè lo stesso EX4 può essere collegato a qualsiasi coppia.

-In questo modo abbiamo solo una base di codice da mantenere.

-La logica rimane la più semplice possibile.

 
cloudbreaker:

Supponendo qui che stiamo parlando di una singola strategia di trading attraverso le coppie di valute:-

Preferisco rendere i miei EAs pair-agnostic - cioè lo stesso EX4 può essere collegato a qualsiasi coppia.

-In questo modo abbiamo solo una base di codice da mantenere.

-La logica rimane la più semplice possibile.

Sì, questo sarebbe l'ideale, ma ho impostato un filtro manuale per ogni valuta ogni giorno, non basato sull'indicatore, in più risulta essere 3 strategie anche se l'idea è la stessa. Questo renderebbe il codice davvero grande a mio avviso e macchinoso da regolare su base giornaliera se dovessimo mettere tutto insieme. Per il prossimo futuro programmerò il filtro per ridurre il mio tempo di lavoro, ma ci sono sempre cose che non si possono programmare (90% da programmare, il resto è a cosa serve il cervello credo. Anche se ho inseguito il 'santo graal' prima di cercare di programmare tutto e arrivare al modello perfetto haha, guardando nella direzione sbagliata).


Sto lanciando le 2 strategie dal vivo questo lunedì, dato che il codice è pronto. Sono state eseguite manualmente da mio suocero e da me stesso un po', la codifica dovrebbe portare risultati più alti. Per la strategia Combined posso lanciare 2 EA sullo stesso grafico (uno per il lungo e uno per il corto), ma voglio ancora imparare, quindi riprenderò il processo di codifica. Quindi aspettatevi molte domande molto presto!


In quale paese risiedi? Sono a Londra, Regno Unito.

 

Ehi, cloudbreaker e altri guru di mt4 qui!


Domanda: Ho 2 script (uno è per comprare un altro è per shortare). Oggi volevo usarli entrambi su 3 coppie. Ora, siccome solo 1 EA può essere collegato ad un grafico, ho aperto 6 grafici (2 per coppia) e vi ho collegato gli script. Tuttavia, solo 1 script è stato eseguito. Non ho idea del perché. Qualche aiuto per favore?


Quindi per riassumere: 2 EAs, uno fa solo acquisti un altro fa solo shorting, regole molto semplici (golden cross su emas e basta), profit take 20 pips, nessuno stop loss. Perché solo 1 viene eseguito? Ho controllato che Expert Advisors fosse attivato, e tutti gli script avevano delle facce sorridenti accanto a loro nei grafici.

 
niko:

Ehi, cloudbreaker e altri guru di mt4 qui!


Domanda: Ho 2 script (uno è per comprare un altro è per shortare). Oggi volevo usarli entrambi su 3 coppie. Ora, siccome solo 1 EA può essere collegato ad un grafico, ho aperto 6 grafici (2 per coppia) e vi ho collegato gli script. Tuttavia, solo 1 script è stato eseguito. Non ho idea del perché. Qualche aiuto per favore?


Quindi per riassumere: 2 EAs, uno fa solo acquisti un altro fa solo shorting, regole molto semplici (golden cross su emas e basta), profit take 20 pips, nessuno stop loss. Perché solo 1 viene eseguito? Ho controllato che Expert Advisors fosse attivato, e tutti gli script avevano facce sorridenti accanto a loro nei grafici.



Cosa dicono i file di log, cioè quello nella directory logs e quello nella directory experts?

Ricevi qualche messaggio "Trade Context Busy"? Se sì, allora raccomanderei di aggiungere una logica che faccia uso della funzione IsTradeAllowed().

In caso contrario, ti consiglierei di disseminare i tuoi EA di istruzioni Print().

 
cloudbreaker wrote >>

Cosa dicono i file di log, cioè quello nella directory logs e quello nella directory experts?

Ricevi qualche messaggio "Trade Context Busy"? Se sì, allora vi consiglio di aggiungere una logica che faccia uso della funzione IsTradeAllowed().

In caso contrario, ti consiglierei di disseminare i tuoi EA di istruzioni Print().

hey cloudbreaker! grazie per essere venuto in soccorso!

1. Cosa intendi per directory di log? Come faccio a raggiungerle entrambe? (Ho provato ad aprirla tramite C>ProgramFiles>MT4>Experts>Logs ma la cartella risulta vuota).

 
niko wrote >>

ehi cloudbreaker! grazie per essere venuto in soccorso!

1. Cosa intendi per directory di log? Come faccio a raggiungerle entrambe? (Ho provato ad aprirla tramite C>ProgramFiles>MT4>Experts>Logs ma la cartella risulta vuota).

Ehi, rompiscatole!

Ho rivisto i tuoi commenti sulla codifica già un sacco di volte (li ho tutti postati sulla mia bacheca), cercando di capire e mettere insieme i pezzi, ma sono ancora completamente perso. Per quanto ho ottenuto è stato copiare la funzione MyOrderCount da un altro EA, ma ancora nessuna idea su come integrarla nel codice. Sono completamente fuori dalla mia portata, ma questo non significa che non possiamo progredire. Se poteste aiutarmi a costruire il codice un po' alla volta (e indirizzarmi verso cose forse più specifiche che potrei anche costruire da solo) allora riusciremo a fare il codice e imparerò molto più velocemente.

Ho allegato il codice fino a dove sono arrivato con esso, e anche la mappa del design del programma come lo vedo io. Non preoccupatevi delle cose minori come le parentesi nel codice, le controllerò due volte con notepad++ mentre andiamo avanti.

La priorità principale è che mi aiutiate a integrare passo dopo passo il codice di MyOrderCount nel resto, e per favore spiegate tutto un po' alla volta mentre andiamo avanti. Oppure potete anche inviarmi parti specifiche del libro o qualcosa del genere se lo ritenete opportuno. In questo modo progrediremo molto più velocemente.

Grazie!

ps: fatemi sapere se la mappa del programma non ha allegato

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

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
if(Bars<75)
     {
     Print("Bars less than 100");
     return(0);
     }
  //-------------------Declaring All Variables and Conditions

double ema1,ema2,ema3,closeup, e1over2, e2over3,e1under2,e2under3;

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;
//--------------------declaration end

//-------------order counting code
int CalculateNumberOfOrders(string Symbol)
{
int long=0,short=0;
for(int i=0;i<OrdersTotal();i++)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)break;
      if(OrderType()==OP_BUY)long++;
      if(OrderType()==OP_SELL)sell++;
     {
  //---return orders Volume
  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.


//------------------EURUSD Block-------------------------
//check order type, if it doesn't equal to buy already then buy
if(OrderType()
     {
    static int ticket;
      // deleted if(OrdersTotal()==0)
     if(e1under2 && e2under3)     // short function
       {
        ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point,"Short
Order ",0,0,Red);
        if(ticket>0)
              {
              if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SHORT order opened : ",OrderOpenPrice());
              }
              //return(0);
       }

      //  -------------------------------------------------------------------------------------------

      {
      static int ticket1;
            // deleted if(OrdersTotal()==0)
        if(e1over2 && e2over3) //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);   //the problem is with this return not being
in the right place i think
        }
      }
return(0);
}
}

ps: si prega di ignorare i commenti // casuali nel codice, il suo da vecchie note

 
niko wrote >>

Ehi, rompiscatole!

Ho letto i tuoi commenti sulla codifica già un sacco di volte (li ho tutti postati sulla mia bacheca), cercando di capire e mettere insieme il tutto, ma ancora completamente perso. Per quanto ho ottenuto è stato copiare la funzione MyOrderCount da un altro EA, ma ancora nessuna idea su come integrarla nel codice. Sono completamente fuori dalla mia portata, ma questo non significa che non possiamo progredire. Se poteste aiutarmi a costruire il codice un po' alla volta (e indirizzarmi verso cose forse più specifiche che potrei anche costruire da solo) allora riusciremo a fare il codice e imparerò molto più velocemente.

Ho allegato il codice fino a dove sono arrivato con esso, e anche la mappa del design del programma come la vedo io. Non preoccupatevi delle cose minori come le parentesi nel codice, le controllerò due volte con notepad++ mentre andiamo avanti.

La priorità principale è che mi aiutiate a integrare passo dopo passo il codice di MyOrderCount nel resto, e per favore spiegate tutto un po' alla volta mentre andiamo avanti. Oppure potete anche inviarmi parti specifiche del libro o qualcosa del genere se lo ritenete opportuno. In questo modo progrediremo molto più velocemente.

Grazie!

ps: fatemi sapere se la mappa del programma non ha allegato

ps: si prega di ignorare i commenti // casuali nel codice, il suo da vecchie note

Ciao Niko

Posso aggiungere i miei due penny a questa discussione,

Come vecchio, praticamente antico :), programmatore con un po' di esperienza di insegnamento e formazione, mi sono imbattuto in un bel po' di cattivo codice nel mio tempo. Un errore comune che porta al codice scritto male è la mancanza di pianificazione. Può essere ovvio, ma avete davvero bisogno di specificare cosa volete fare prima di iniziare a provare a codificarlo. Questo può sembrare un lavoro extra ma vi farà risparmiare un sacco di tempo nel lungo periodo e produrrà un codice più affidabile, più comprensibile e più facilmente mantenibile.

Una tecnica molto utile per specificare il codice del computer è conosciuta come Pseudo-Codifica. Fondamentalmente è solo un insieme logico di istruzioni simili a quelle del computer scritte in inglese semplice. Non c'è un formato particolare richiesto, ma si può usare il tipico gergo dei programmi informatici che si trova in una forma o nell'altra in quasi tutti i linguaggi di programmazione.

Ecco un esempio di codice pseudo per cucinare formaggio e maccheroni. L'ho preso da un articolo "Intro to Programming by Patrick Nouvion" sul sito IBFX. L'intero articolo è probabilmente da leggere. http://www.ibfx.com/ibfxu/catalog/programming/pro1010.aspx

AVVIARE
Trovare il latte e il burro e la scatola Kraft
Se trovato continua
altrimenti manda il bambino al negozio

Trova la pentola nella credenza

Se trovato continuare altrimenti chiedere alla moglie di aiutare a trovarlo

Trova la stufa
Se trovato continua
altrimenti ordina una pizza

Controllare se c'è un fornello disponibile
Se disponibile continuare
altrimenti rendere disponibile

Accendere la stufa su alto
Trovare l'acqua
Se trovata continuare
altrimenti ordina la pizza

Mettere l'acqua nella pentola
Assicurarsi che la stufa sia calda
se è caldo continua
altrimenti controlla che sia collegato
altrimenti chiama il tecnico e ordina la pizza

Mettere la pentola sul bruciatore
se hai il sale aggiungi un pizzico di sale
se no continuare
se hai il pepe aggiungi un pizzico di pepe
se no continuare
mentre l'acqua non bolle attendere
aprire la scatola Kraft
aggiungere i maccheroni dalla scatola alla pentola
aspettare 8 minuti
nell'attesa, se la pentola bolle troppo, abbassare il fuoco e soffiarci sopra
Trovare uno scolapasta
Scolare i maccheroni nello scolapasta
rimettere in pentola
aggiungere il contenuto del pacchetto di formaggio
aggiungere il burro
aggiungere 1 cucchiaio di latte
mescolare per combinare
se troppo denso aggiungere 1 cucchiaio di latte; se no, mangiare
FINE

Se stessi scrivendo questo pseudo codice, lo perfezionerei un po' di più suddividendolo in blocchi funzionali e usando un po' di indentazione per renderlo "carino". Per esempio

START BLOCK - Preparare l'acqua bollente

Mettere l'acqua nella pentola

Metti la pentola sul bruciatore
se hai il sale aggiungi un pizzico di sale
se non continuate
se avete il pepe aggiungete un pizzico di pepe
altrimenti continuare
mentre l'acqua non bolle attendere

BLOCCO FINE - Preparare l'acqua bollente

e così via....

Niko, mi congratulo con te per voler imparare a scrivere il tuo codice. Nella mia esperienza, il modo più facile e veloce per imparare è fare quello che stai facendo e provare. Quello che ti suggerirei però è di fare un breve passo indietro e scrivere quello che vuoi ottenere in pseudo codice. Questo dovrebbe aiutarvi a chiarirvi le idee su cosa esattamente state cercando di ottenere.

Una volta che l'avete fatto, potreste postarlo qui per me o per qualcun altro che gli dia un'occhiata. Una volta che hai lo pseudo codice giusto, allora puoi iniziare a convertirlo in codice MT4. Cercare di fare tutto in una volta sola è un salto troppo grande, soprattutto se sei un principiante.

A proposito, il mio pseudo codice non è mai sprecato. La maggior parte di esso finisce come commenti nel mio codice finito.

Buona fortuna!

Tim Wilson

 
niko:

Ehi, rompiscatole!

Ho letto i tuoi commenti sulla codifica già un sacco di volte (li ho tutti postati sulla mia bacheca), cercando di capire e mettere insieme il tutto, ma ancora completamente perso. Per quanto ho ottenuto è stato copiare la funzione MyOrderCount da un altro EA, ma ancora nessuna idea su come integrarla nel codice. Sono completamente fuori dalla mia portata, ma questo non significa che non possiamo progredire. Se poteste aiutarmi a costruire il codice un po' alla volta (e indirizzarmi verso cose forse più specifiche che potrei anche costruire da solo) allora riusciremo a fare il codice e imparerò molto più velocemente.

Ho allegato il codice fino a dove sono arrivato con esso, e anche la mappa del design del programma come la vedo io. Non preoccupatevi delle cose minori come le parentesi nel codice, le controllerò due volte con notepad++ mentre andiamo avanti.

La priorità principale è che mi aiutiate a integrare passo dopo passo il codice di MyOrderCount nel resto, e per favore spiegate tutto un po' alla volta mentre andiamo avanti. Oppure potete anche inviarmi parti specifiche del libro o qualcosa del genere se lo ritenete opportuno. In questo modo progrediremo molto più velocemente.

Grazie!

ps: fatemi sapere se la mappa del programma non ha allegato

ps: si prega di ignorare i commenti // casuali nel codice, il suo da vecchie note

Una rapida occhiata mi dice che stai facendo un errore fondamentale.

Sembra che tu stia cercando di dichiarare la funzione MyOrderCount() all'interno del codeblock della funzione start().

Pensate al vostro codice come una serie di funzioni init(), start(), yourfunction1(), yourfunction2() ... yourfunctionN().

Le funzioni init() e start() sono funzioni speciali. La funzione init() viene eseguita una volta quando si inizializza l'EA. La funzione start() viene eseguita ogni volta che arriva un tick.

Quindi la funzione start() forma la radice da cui tutta la tua logica sarà chiamata una volta che l'EA è attivo e funzionante.

Per esempio, ogni volta che arriva un tick, la tua funzione start() verrà eseguita e farà questo:

- controllare alcune condizioni

- se le condizioni sono soddisfatte, esegue un ordine

Una delle condizioni di cui hai bisogno è assicurarti di non avere già un ordine del tipo (diciamo buy) prima di eseguire un ordine di acquisto.

Quindi, dall'interno della funzione start(), dovrai scoprire quali ordini di acquisto esistono tramite una CALL alla tua funzione di conteggio degli ordini di acquisto (il cui codeblock si trova FUORI dalla funzione start()).

La tua funzione di conteggio degli ordini restituirà il numero di ordini di acquisto e tu riprenderai l'esecuzione della funzione start() nella linea successiva alla tua chiamata alla funzione di conteggio degli ordini di acquisto.

Poi userete il valore restituito dalla funzione di conteggio degli ordini di acquisto per determinare se eseguire o meno il vostro ordine di acquisto.

L'esecuzione effettiva dell'ordine di acquisto può essere una chiamata ad UN'ALTRA funzione che crei per te (di nuovo, dichiarata al di fuori della funzione start()).

Spero che questo abbia senso. Potreste strutturarlo in modo completamente diverso, ma sto solo cercando di farvi capire il concetto di funzioni e chiamate.


CB

 

Ehi TSWilson e CB!

Voi ragazzi siete grandiosi! Grazie mille.

Completamente a posto per quanto riguarda lo pseudo codice. L'ho fatto quando ho fatto una programmazione di base in linguaggio pro**realtime, ma lì era così semplice, nessuna dichiarazione, nessun blocco, ecc (tutto il codice era solo 'if...then' haha). Ho iniziato lo pseudo codice questa mattina (sono arrivato al lavoro un'ora prima solo per farlo) e ho scritto un diagramma visivo su come e quali blocchi avere. Lo finirò più tardi oggi e lo posterò qui.

Una volta fatto questo, il resto dei blocchi e le specifiche del codice che posso capire con il vostro aiuto ragazzi. Quindi torniamo al tavolo da disegno per ora!

Sono felice di lavorare tutta la notte oggi e domani per finire il codice al più presto, perché sono fuori in vacanza la prossima settimana e voglio avere tutto pronto prima di andare.

Quindi continuate a guardare questo thread oggi, posterò lo pseudo codice e il diagramma!

E come sempre, grazie all'Universo per persone come te!

Motivazione: