Come codificare? - pagina 206

 

Usare file esterni *.set

Ho provato e riprovato ma non riesco a capirlo, quindi spero che qualcuno possa vedere l'albero attraverso la foresta.

Voglio programmare un EA per usare o le sue impostazioni programmate o un file *.set esterno.

Quindi se:

extern bool UseExternSet = true;

userà le impostazioni nel file set esterno piuttosto che le impostazioni programmate.

So che può essere fatto ma semplice perso qui.

Qualsiasi esempio ea farà

Bernard

 

Problema di compilatore o problema di codice?

extern int ma1period=5;

extern int ma1method=1;

extern int ma1tf=0;

extern int ma2period=5;

extern int ma2method=1;

extern int ma2tf=10080;

extern double lots=1;

int init(){}

int deinit(){}

double CMA (int tf,int period, int shift, int method)

{

double MA=iMA(NULL,tf,period,0,method,0,shift)

return(MA)

}

int start()

{

int BarsCount=0;

if (Bars> BarsCount)

{

BarsCount=Bars;

double ma1.1=CMA(ma1tf,ma1period,1,ma1method);

double ma1.2=CMA(ma1tf,ma1period,2,ma1method);

double ma2.1=CMA(ma2tf,ma2period,1,ma2method);

double ma2.2=CMA(ma2tf,ma2period,2,ma2method);

bool ma1upsignal =ma1.2<ma1.1;

bool ma1downsignal =ma1.2>ma1.1;

bool ma2upsignal =ma2.2<ma2.1;

bool ma2downsignal =ma2.2>ma2.1;

if (ma1upsignal&&ma2upsignal)

{

OrderSend(Symbol(),OP_BUY,lots,Ask,3,NULL,NULL,NULL,NULL,0,Green);

}

if (ma1downsignal&&ma2downsignal)

{

OrderSend(Symbol(),OP_SELL,lots,Bid,3,NULL,NULL,NULL,NULL,0,Green);

}

if ((ma1upsignal&&ma2downsignal)||(ma1downsignal&&ma2upsignal))

{

int total=OrdersTotal(); //Script to close all open orders.

for(int i=total-1;i>=0;i--)

{

OrderSelect(i, SELECT_BY_POS);

int type = OrderType();

switch(type)

{

//Close opened long positions

case OP_BUY : OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );

break;

//Close opened short positions

case OP_SELL : OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );

}

}

}

}

Questo è il pezzo di codice su cui sto lavorando. Il compilatore dice "la variabile BarsCount non è definita". Cosa devo fare? Per quanto posso vedere, la variabile è stata inizializzata e le è stato dato un valore.

È un problema del mio compilatore o un problema di codice?

File:
capture2_1.png  12 kb
 

[CODICE]

doppio CMA (int tf,int periodo, int shift, int metodo)

{

double MA=iMA(NULL,tf,period,0,method,0,shift);

return(MA);

}

 
username1:
[CODICE]

doppio CMA (int tf, int periodo, int shift, int metodo)

{

double MA=iMA(NULL,tf,period,0,method,0,shift);

return(MA);

}

Michel,

Grazie. Questo ha risolto il problema :-)

 

Conteggio di barre consecutive

Qualcuno ha del codice su come contare le barre consecutive di acquisto/vendita in una fila? Voglio contare quante volte su un grafico (inserire il numero di barre da controllare) ci sono 1 barra di vendita in una riga, 32 barre di vendita in una riga, 3 barre di vendita in una riga, 4 barre di vendita in una riga (lo stesso w / buy) ecc.

So che devo fare un loop, ma non riesco a capire come.

I risultati possono andare in un Comment().

Grazie.

 

Perché il mio programma non funziona?

Ho scritto un semplice programma.

Si suppone che entri solo un ordine alla volta e che esca con un take profit o uno stop loss.

E' impostato per M30 su GBPUSD.

Cioè: alcune delle costanti sed nel programma sono trovate da stime "a occhio". Questo non dovrebbe influenzare molto il programma... non funziona nemmeno con costanti diverse. (Almeno, quando testato con lo Strategy Tester, impostato su veloce o medio: non "tick by tick". (troppo lento...)

Comunque il programma, quando testato, non inserisce un ordine e non controlla mai nella direzione "up". (Questo, tramite il "print"/trace)

(dovrebbe controllare: entrare con un acquisto o entrare con una vendita)

Logica incidentale: controlla 2 barre consecutive. Se la barra 1 ha entrambi: un massimo più alto e un minimo più alto, il programma pensa che la prossima barra sarà al rialzo.

(Simmetricamente al ribasso).

Take profit e stop loss sono impostati di conseguenza.

Il programma non funziona anche quando le istruzioni "if" sono annidate....

Grazie per aver dato un'occhiata a questo.

//+------------------------------------------------------------------+

//| funzione di inizializzazione dell'esperto |

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| funzione di deinizializzazione esperto |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| funzione di inizio esperto |

//+------------------------------------------------------------------+

int start()

{

//----

bool TrendUp1; double TakeProfitUp; double EE = .00500;

bool OrdTot_OK;double lot;double slip;

double SL_Trailing_Up;bool High2Up;bool Low2Up;

int ticketup;int ticketdown;bool DownAndBig; bool UpAndBig;

bool TrendDown; double SL_Trailing_Down; double TakeProfitDown;

bool High2down; bool Low2down;

int ABC = OrdiniTotali();

double Size1 = .00630; bool BigUp; double A = High[1]; double B= Low[2]; //41

double C= High[2]; double D= Low[1];bool BigDown;

//------------------------------------down inizio ordine

if (ABC == 0)// nessun ordine in uscita è vero

OrdTot_OK = true;

se (ABC == 0)// nessun ordine in uscita è vero

Stampa ("sulla sequenza di ordini al ribasso, nessun ordine in uscita");

if ((C-D) > Size1)//alto di 2 meno basso di 1 > .0063

BigDown = true;

se ((C-D) > Size1)//alto di 2 meno basso di 1 > .0063

Stampa ("sulla sequenza di ordini al ribasso, trovato un grande breakout al ribasso");

se (Alto[1]< Alto[2])

High2down=true;

se (Alto[1]< Alto[2])

Stampa ("sulla sequenza di ordini al ribasso, le barre consecutive hanno massimi decrescenti");

se (Basso[1]< Basso[2])

Low2down=true;

se(Basso[1]< Basso[2])

Stampa ("sulla sequenza di ordini al ribasso, le barre consecutive hanno minimi decrescenti");

if (High2down && Low2down)

TrendDown=vero;

se (High2down && Low2down)

Stampa ("sulla sequenza di ordini al ribasso, il flag TrendDown è impostato");

se (TrendDown)

SL_Trailing_Down = High[1];

se (TrendDown)

Stampa ("sulla sequenza di ordini al ribasso, ha impostato lo stop_loss");

se (TrendDown)

TakeProfitDown = Bid - (.005);

se (TrendDown)

Stampa ("sulla sequenza di ordini al ribasso, ha ottenuto un takeprofit", TakeProfitDown);

se (TrendDown && BigDown)

DownAndBig = true;

if (DownAndBig && OrdTot_OK)

ticketdown= OrderSend(Symbol(),OP_SELL,lot, Bid,slip,SL_Trailing_Down,TakeProfitDown,Blue);

if (DownAndBig && OrdTot_OK)

Stampa ("sulla sequenza di ordini al ribasso, ha cercato di inserire un biglietto", ticketdown);

se (ticketdown < 0)

Print("OrderSend_Down fallito con errore #",GetLastError());

return(0);

//----------------------------------------------down order done

//---------------------------------------------------up order start

se (ABC == 0)

OrdTot_OK = true;

se (ABC == 0)

Stampa ("sulla sequenza in salita, nessun ordine è uscito");

se ((A - B) > Dimensione1)

BigUp = true;

se ((A - B) > Size1)

Stampa ("sulla sequenza in salita, il test delle dimensioni per le due barre era ok");

se (Alto[1] > Alto[2])

High2Up = true;//44

se (Alto[1] > Alto[2])

Stampa ("sulla sequenza in salita, il test per i massimi crescenti era ok");

if(Basso[1] > Basso[2])

Low2Up=vero;

se(Basso[1] > Basso[2])

Stampa ("sulla sequenza in salita, il test per i minimi crescenti era ok");

if (High2Up && Low2Up)

TrendUp1=vero;

if (High2Up && Low2Up)

Stampa ("sulla sequenza di salita, ha impostato il flag per la salita");

se (TrendUp1)

SL_Trailing_Up = Low[1] ;

se (TrendUp1)

Stampa ("sulla sequenza in salita, stabilito lo stoploss");

se (TrendUp1)

TakeProfitUp = Ask + (.005);

se (TrendUp1)

Stampa ("sulla sequenza in salita, stabilito il takeprofit", TakeProfitUp);

se (TrendUp1 && BigUp)

UpAndBig = true;

se ( UpAndBig && OrdTot_OK)

ticketup = OrderSend(Symbol(), OP_BUY,lot, Ask,slip, SL_Trailing_Up,TakeProfitUp,Red);

se (UpAndBig && OrdTot_OK)

Stampa ("sulla sequenza in salita, ha cercato di inviare un ordine", ticketup);

se (ticketup < 0)

Print("OrderSend_Up fallito con errore #",GetLastError());

return(0);

//-------------------------------------------------up order done

//----

return(0);// non sono sicuro di questa linea

//+------------------------------------------------------------------+

//----

return(0);

}

//+------------

 

Barre minime prima/dopo il commercio

Ciao,

Ciao, sono nuovo di MT4. Qualcuno potrebbe farmi sapere come posso inserire una restrizione in un EA che richiede un minimo di "x" barre per aprire una nuova posizione o chiuderne una precedente?

(senza usare il comando sleep)

Saluti.

 

aiuto alla codifica mql

se (iMA(NULL, 0, 24, 0, MODE_LWMA, PRICE_WEIGHTED, 1) > iMA(NULL, 0, 120, 1, MODE_LWMA, PRICE_WEIGHTED, 1)) gi_268 = 2;

---------------------------------------------------------------

cosa significa?

2 LWMA utilizzati ?

LWMA periodo =24 shift =0 su prezzo ponderato (hcll4) cross over LWMA periodo 120 shift =1 su prezzo ponderato (hcll4) poi comprare o vendere ??

 

Problema con la posizione di chiusura

Salve,

Ho appena iniziato con il mio nuovo EA e l'apertura delle posizioni è OK, ho impostato tp e sl. L'EA apre e chiude le posizioni 1 per 1 e non ci sono mai più di 1 ordine. Ma vorrei chiudere la posizione se alcuni indicatori mi avvisano prima del limite di sl o tp.

Se provo a fare qualcosa del genere:

for (int i=1; i<=OrdersTotal(); i++) {

if (OrderSelect(i, SELECT_BY_POS, 2)) {

if (OrderSymbol()==Symbol()) {

Ans=OrderClose(OrderTicket(),alLots,Bid,2);// Order closing

}

}

}[/CODE]

Nothing happened. Doesn't find any opened positions and I know there is 1.

If I try something like this:

for (int i=1; i<=OrdersTotal(); i++) {

CloseOrder(OrderValue(i,VAL_TICKET),OrderValue(i,VAL_LOTS),Bid,3);

}

Compiler report error message that VAL_TICKER and VAL_LOTS are not defined and in examples I found they are nowhere declared.

If I try direcly by number to close:

[CODE]

Ans=OrderClose(0,alLots,Bid,2);// Order closing

Ottengo il messaggio di errore 4107 o 4105 che il ticker non è valido

Qualcuno può controllare questo e il mio ea in allegato e aiutare per favore?

Grazie mille

File:
rsiproba.mq4  6 kb
 

iMassimo iMinimo Chiarimento

Supponiamo 3 barre: Barra [2], barra [1] e barra [0] (corrente).

La seguente funzione "stop_low()" è corretta per trovare il minimo più basso delle barre [2] e [3] ?

doppio stop_low = iLowest(Symbol(),0,1,2,1);

------------------------------------------------------------

Riferimento:

int iLowest( string symbol, int timeframe, int type, int count=WHOLE_ARRAY, int start=0)

Restituisce lo spostamento del valore minimo su un numero specifico di periodi a seconda del tipo.

Parametri:

symbol - Simbolo i cui dati devono essere usati per calcolare l'indicatore. NULL significa il simbolo corrente.

timeframe - Timeframe. Può essere uno qualsiasi dei valori dell'enumerazione Timeframe. 0 significa il timeframe corrente del grafico.

type - Identificatore dell'array di serie. Può essere uno qualsiasi dei valori di enumerazione degli identificatori di serie.

count - Numero di periodi (in direzione dalla barra iniziale a quella posteriore) su cui viene effettuato il calcolo.

start - Spostamento che mostra la barra, relativa alla barra corrente, da cui i dati devono essere presi.

Esempio:

// calcolo del valore più basso sulle 10 barre conseguenti nell'intervallo

// dal 10° al 19° indice compreso sul grafico corrente

double val=Low;

Motivazione: