Come codificare? - pagina 135

 

Errore di compilazione

Ciao a tutti

Ho il seguente errore:

'<'- tipi diversi nel confronto

Ho provato a modificare la seguente linea:

(NonLagMA_2D_S2&&D_S2Switch==1)

a

(Price_NowD_S2&&D_S2Switch==1)

Dov'è il problema?

Mi dispiace non poter caricare il file mq. Non è il mio script

 
:: confronti qualcosa con tipi diversi, quindi deve essere interi con interi, doppi con doppi, stringhe con stringhe... così...

IN10ZIONE

Badguy:
Ciao a tutti

Ho il seguente errore:

'<'- tipi diversi nel confronto

Provo a modificare la seguente linea:

(NonLagMA_2D_S2&&D_S2Switch==1)

a

(Price_NowD_S2&&D_S2Switch==1)

Dov'è il problema?

Mi dispiace non poter caricare il file mql. Non è il mio script
 

Chiudere una posizione multipla con un numero magico - Aiuto

Ciao a tutti.

Sono nuovo nella programmazione di mt4 e di seguito il mio primo EA. Lo scopo di questo EA è quello di chiudere tutte le posizioni indipendentemente da qualsiasi coppia di valute in base allo stesso numero magico.

Diciamo che sotto il numero magico 8675310, ho 2 posizioni EURUSD & USDCFh. Sarà in grado di chiudere tutte queste coppie quando raggiunge un certo obiettivo di profitto.

Il problema con questo EA è,

Aprire la transazione # 1 EURUSD (in grado di chiudere)

Aprire la transazione # 2 USDCFh (non sarà in grado di chiudere)

NON SARÀ IN GRADO DI CHIUDERE LA TRANSAZIONE # 2.

Qualche idea?

Grazie

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

//| Closing_Trade_By_Magic_No_v1 .mq4

//| Mio |

//| Forex Trading Software: Piattaforma di Trading Forex MetaTrader 4 ||

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

#proprietà copyright "Mia"

#property link "http://www.metaquotes.net"

//---- parametri di input

extern int MagicNumber1=8675310;

extern int Profit1=10;

extern int MagicNumber2=8675311;

extern int Profit2=15;

extern int MagicNumber3=8675312;

extern int Profit3=15;

extern int MagicNumber4=8675313;

extern int Profit4=15;

extern int MagicNumber5=8675314;

extern int Profit5=15;

extern int MagicNumber6=0;

extern int Profit6=10;

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

//| funzione di inizializzazione dell'esperto |

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

int init()

{

onScreenComment(98, "Tengak inizializza...");

//----

//----

return(0);

}

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

//| funzione di deinizializzazione esperto |

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

int deinit()

{

//----

//----

return(0);

}

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

//| funzione di avvio esperto |

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

int start()

{

stringa myMessage="";

mioMessaggio = mioMessaggio + ProfitLossMonitor(1,MagicNumber1,Pr ofit1,mioMessaggio);

mioMessaggio = mioMessaggio + ProfitLossMonitor(2,MagicNumber2,Pr ofit2,mioMessaggio);

mioMessaggio = mioMessaggio + ProfitLossMonitor(3,MagicNumber3,Pr ofit3,mioMessaggio);

mioMessaggio = mioMessaggio + ProfitLossMonitor(4,MagicNumber4,Pr ofit4,mioMessaggio);

mioMessaggio = mioMessaggio + ProfitLossMonitor(5,MagicNumber5,Pr ofit5,mioMessaggio);

mioMessaggio = mioMessaggio + ProfitLossMonitor(6,MagicNumber6,Pr ofit6,mioMessaggio);

onScreenComment(98,mioMessaggio);

//----

//----

return(0);

}

string ProfitLossMonitor(int myGroupNumber,int myMagicNumber, int myProfit,string myMessage )

{

int totale = OrdiniTotali();

double MyCurrentProfit=0;

stringa MyOrderNo="";

for (int cnt = 0 ; cnt < totale ; cnt++)

{

OrderSelect(cnt,SELECT_BY_POS,MODE_ TRADES);

if (OrderMagicNumber() == myMagicNumber)

{

MyCurrentProfit += OrderProfit();

MyOrderNo= MyOrderNo + "," + OrderTicket();

}

}

if(MyCurrentProfit>=myProfit)

CloseAll(myMagicNumber);

myMessage="Posizione del gruppo #" + myGroupNumber + " " + myMagicNumber + "=" + myProfit + "(" + DoubleToStr(MyCurrentProfit,2) + " " + MyOrderNo + ")" + "\n" ;

return (myMessage);

}

void CloseAll(int myMagicNumber)

{

int totale = OrdiniTotali();

for (int cnt = 0 ; cnt < totale ; cnt++)

{

OrderSelect(cnt,SELECT_BY_POS,MODE_ TRADES);

if (OrderMagicNumber() == myMagicNumber)

if(OrderType()==OP_BUY)

OrderClose(OrderTicket(),OrderLots( ),Bid,5,Violet);

se(TipoOrdine()==OP_VENDITA)

OrderClose(OrderTicket(),OrderLots( ),Ask,5,Violet);

}

}

void onScreenComment(int myEvent, string myComment)

{

switch (myEvent)

{

caso 98: Comment(myComment); break;

}

}

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

Modifica/cancellazione del messaggio

 
Il problema con questo EA è,

Open Transaction # 1 EURUSD (able to close)

Aprire la transazione # 2 USDCFh (non sarà in grado di chiudere)

NON SARÀ IN GRADO DI CHIUDERE LA TRANSAZIONE # 2.

Qualche idea?

Presumo che tu stia eseguendo l'ea sul grafico EURUSD nel momento in cui cerchi di chiudere gli ordini, dato che quelle posizioni si chiudono bene. Quando il tuo codice cerca di chiudere le posizioni USDCHF(un po' di dislessia?) sta usando l'offerta e la domanda sbagliate, il prezzo di chiusura che usa è quello della coppia di valute a cui è collegato l'ea, non il prezzo del simbolo delle posizioni. Se stai cercando di chiudere un'altra coppia di valute da un grafico che non corrisponde a quella valuta, devi prima recuperare il prezzo corretto prima di provare a chiuderla.

keit

edit: Anche la valuta, USDCHF in questo caso, deve essere visualizzata nella tua finestra di osservazione del mercato nel momento in cui stai cercando di recuperare le quotazioni corrette per chiudere gli ordini. Se l'USDCHF non è elencato nella finestra di controllo del mercato non sarai in grado di ottenere alcuna quotazione per quella coppia.

 

Grazie cockeyedcowboy!

"è necessario recuperare il prezzo corretto prima di provare a chiuderlo".

Potresti condividere la sintassi o la funzione che può fare le esigenze di cui sopra;

 

come non fare trading fino alla prossima barra

Ho provato a programmare per la prima volta, ma ho un problema.

- se chiudo un trade in una barra, posso aprire un nuovo trade solo quando si apre la nuova barra.

Ho provato quanto segue;

datetime time0=0;

int start()

se (time0 == Time[0]) return;

{

"codice programma"

}

time0 = Time[0];

return(0);

Se tolgo questo pezzo, ottengo entrate multiple in varie barre. Con esso dentro, ottengo molte meno voci (da 70 in un backtest. a 4), ma con voci mancanti.

Qualcuno sa cosa sto sbagliando.

Grazie in anticipo.

 

Potete usare la funzione NewBar() qui sotto.

Come if(NewBar(){ ........programmazione qui

bool NewBar() {

static datetime LastTime = 0;

if (Time[0] != LastTime) {

LastTime = Time[0];

return (true);

} else

return (false);

}

Potresti anche testare gli ordini aperti se vuoi solo un ordine alla volta.

Spero che questo aiuti.

Lux

 

Lux

Grazie per il tuo aiuto con questo.

Penso di aver capito cosa stava succedendo nel programma.

Prima controllavo la presenza di una nuova barra all'inizio, quindi il programma controllava solo il primo tick della nuova barra per vedere se era d'accordo con i miei segnali, senza controllare gli altri tick. Questo è il motivo per cui sono arrivati pochi segnali di trading nel backtest.

Ora ho posizionato il codice correttamente (cioè dove si trova la mia istuzione ordersend) e sembra funzionare bene.

Sono corretto nel mio pensiero?

 

Per favore aiutate ad aggiornare il codice dell'esperto.

C'è un esperto semplice. Il codice è chiaro e semplice, ma ho un grosso problema - expert ha solo un tentativo di aprire/chiudere un ordine.

Qualcuno può aiutare a risolvere il problema?

L'esperto deve provare 5-10 volte ad aprire/chiudere l'ordine.

Forse n=numero di tentativi, e per favore senza "while".

Grazie mille.

File:
test.mq4  9 kb
 

Il mio codice per 'regolare i lotti dopo la perdita', bisogno di aiuto..grazie

Il mio codice qui sotto per 'regolare i lotti dopo la perdita', ma ha fatto un massaggio di errore"posizione di inizio non corretta 0 per la funzione ArraySort" durante il test. Qualcuno può aiutarmi a risolvere il problema?

double AdjtLotsByWinRate( int magicnumber,double NormLots)

{

int i,counter;

int ProfitAndTime[][2];

double Profits[];

//----

ArrayResize(ProfitAndTime,OrdersHistoryTotal());

for (i=0;i<OrdersHistoryTotal();i++)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

{

if (OrderType()<=OP_SELL && OrderMagicNumber()==magicnumber ) // 0 OP_BUY 1 OP_SELL 2 OP_BUYLIMIT 3 OP_SELLLIMIT 4 OP_BUYSTOP 5 OP_SELLSTOP

{

ProfitAndTime[counter][0]=OrderCloseTime();

ProfitAndTime[counter][1]=OrderProfit();

counter++;

}

}

}

ArrayResize(ProfitAndTime,counter);

ArrayResize(Profits,counter);

ArraySort(ProfitAndTime);

for (i=0;i<counter;i++)

{

Profits=ProfitAndTime[1];

}

//Print(Profits);

int err=GetLastError();

int WinRate_N=0,WinRate_A=5;

double WinRate;

for (i=counter;i<counter-WinRate_A+1;i--)

{

if (Profits>0){

WinRate_N=WinRate_N+1;

}

else if (Profits<0)

{

WinRate_N=WinRate_N-1;

}

else

{

WinRate_N=WinRate_N+0;

}

}

WinRate=WinRate_N/WinRate_A;

double NewLots;

if (WinRate>=0.7)

{

NewLots=NormLots*1.5;

}

else if (WinRate>=0.5 && WinRate<0.7)

{

NewLots=NormLots*1;

}

else if (WinRate>=0.3 && WinRate<0.5)

{

NewLots=NormLots*0.5;

}

else //if (WinRate<0.3)

{

NewLots=NormLots*0.1;

}

return(NewLots);

}