borilunad: Buongiorno, Artyom! Sì, è chiaro che si tratta di maghi! Ma quando qualcosa non è in un ciclo, ma in condizioni di tipo if-else, sarà sufficiente mettere la prima condizione if(Symbol()==mySymbol) (senza else, ovviamente), presentando precedentemente mySymbol=Symbol()?! In modo che tutte le variabili di tutti gli EA siano le stesse, ma ognuno sul proprio grafico! Non posso ancora controllare, sto ancora scrivendo, "facendo uscire"! :)
Se la stringa mySymbol=Symbol();, allora questa variabile conterrà il valore del simbolo corrente. Di conseguenza, per ogni EA, che negozia sul proprio grafico, il valore di questa variabile sarà uguale al valore del simbolo, sul quale l'EA è stato lanciato.
artmedia70: Se la stringa mySymbol=Symbol();, allora questa variabile terrà il valore del simbolo corrente. Di conseguenza, per ogni EA che negozia sul proprio grafico, il valore di questa variabile sarà uguale al valore del simbolo, sul quale l'EA è stato lanciato.
In qualche modo, non ho pensato alla corda! Sto ancora lottando con errori in funzioni testate che funzionano bene in altri EA!Grazie mille!
//+------------------------------------------------------------------+//| cci on ma.mq4 |//| Copyright 2014, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"2005-2014, MetaQuotes Software Corp."#property link"https://www.mql4.com"#property strictinputdouble Lots =0.1;
inputint Expiration =5; //laikas minutemis//---- input parametersinputint cci_p = 89;
inputint ma = 13;
inputint NumberOfBarsToCalculate = 100;
inputstring comment=".csv or .txt";//коментарийinputstring FileType="csv";//тип файла datetime op_time=0,cl_time=0;
double op_price=0,cl_price=0;
int op_type=0;
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnTick(void)
{
int cnt,ticket,total;
//---if(Bars<cci_p+1)
{
Print("bars less than ",cci_p);
return;
}
//--- to simplify the coding and speed up access data are put into internal variablesdouble cci_dn=iCustom(NULL,0,"cci_ma",cci_p,ma,NumberOfBarsToCalculate,2,0);
double cci_up=iCustom(NULL,0,"cci_ma",cci_p,ma,NumberOfBarsToCalculate,3,0);
total=OrdersTotal();
if(total<1)
{
//--- check for long position (BUY) possibilityif(cci_up>0 && cci_up!=EMPTY_VALUE)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"cci sample",16384,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
op_time=TimeLocal();
op_price=Close[0];
op_type=1;
Print("BUY order opened : ",OrderOpenPrice());
Print("op_price : ",op_price, "op_time : ",op_time);
}
elsePrint("Error opening BUY order : ",GetLastError());
return;
}
//--- check for short position (SELL) possibilityif(cci_dn<0 && cci_dn!=EMPTY_VALUE)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"cci sample",16384,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
op_time=TimeLocal();
op_price=Close[0];
op_type=-1;
Print("BUY order opened : ",OrderOpenPrice());
Print("op_price : ",op_price, "op_time : ",op_time);
}
elsePrint("Error opening SELL order : ",GetLastError());
}
//--- exit from the "no opened orders" blockreturn;
}
//--- it is important to enter the market correctly, but it is more important to exit it correctly... for(cnt=0;cnt<total;cnt++)
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
continue;
if(OrderType()<=OP_SELL && // check for opened position
OrderSymbol()==Symbol()) // check for symbol
{
//--- long position is openedif(OrderType()==OP_BUY)
{
//--- should it be closed?if(TimeCurrent()>=op_time+Expiration*60)
{
//--- close order and exitif(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
cl_time=TimeCurrent();//op_time+Expiration*60;
cl_price=Close[0];
Print("OrderClose error ",GetLastError());
PrintToFile(op_price, cl_price, op_type, op_time, cl_time);
return;
}
}
else// go to short position
{
//--- should it be closed?if(TimeCurrent()>=op_time+Expiration*60)
{
//--- close order and exitif(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
cl_time=TimeCurrent();//op_time+Expiration*60;
cl_price=Close[0];
Print("OrderClose error ",GetLastError());
PrintToFile(op_price, cl_price, op_type, op_time, cl_time);
return;
}
}
}
}
//---
}
//+------------------------------------------------------------------+void PrintToFile(double opPrice=0,double clPrice=0,int opType=0, datetime opTime=0, datetime clTime=0)
{
string fileName=StringConcatenate(Symbol()," ",Period()," ","gi_EA_cci");
int handle;
handle=FileOpen(fileName+FileType, FILE_WRITE|FILE_READ,";");
if(handle!=INVALID_HANDLE)
{
PrintFormat("Файл %s открыт для записи",fileName);
PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- сначала запишем количество сигналовFileSeek(handle, 0, SEEK_END);
FileWrite(handle,
opPrice,
clPrice,
opType,
TimeToString(opTime,TIME_MINUTES|TIME_SECONDS),
TimeToString(clTime,TIME_MINUTES|TIME_SECONDS));
//--- закрываем файлFileClose(handle);
PrintFormat("Данные записаны, файл %s закрыт",fileName);
}
elsePrintFormat("Не удалось открыть файл %s, Код ошибки = %d",fileName,GetLastError());
}
beginner: Puoi dirmi come definire un prelievo sulla scheda?
Per alcuni "ordini", OrderType() produce un valore numericamente uguale a 6. Questi sono i prelievi e i depositi.
Dopo una chiamata a OrderSelect() che ha avuto successo (restituito true), si può determinare la dimensione del prelievo/ricarico dal valore restituito da OrderProfit(), e dal segno di questo valore - se è un prelievo o un deposito...
Inoltre, alcuni broker fanno pagare una tassa, imitando un prelievo per l'importo della tassa. Si può cercare di distinguere l'addebito della commissione dal prelievo dal conto con un commento ottenuto usando OrderComment().
Tuttavia, fate attenzione: tutto questo non è documentato e potrebbe smettere di funzionare in qualsiasi momento.
Cari programmatori! Quando si ottimizza un Expert Advisor, io personalmente, credo, come molti altri partecipanti, cerco di trovare il massimo rapporto tra profitto e massimo drawdown (rapporto: profitto/perdita), che credo sia l'indicatore più importante. Faccio questa procedura manualmente dopo il completamento dell'esecuzione del tester. È possibile automatizzare questo processo? Oppure, come fa ognuno di voi a determinare questo parametro? Grazie in anticipo.
yosuf: Cari programmatori! Quando si ottimizza un Expert Advisor, io personalmente, credo, come molti altri partecipanti, cerco di trovare il massimo rapporto tra profitto e massimo drawdown (rapporto: profitto/perdita), che credo sia l'indicatore più importante. Faccio questa procedura manualmente dopo il completamento dell'esecuzione del tester. È possibile automatizzare questo processo? Oppure, come fa ognuno di voi a determinare questo parametro? Grazie in anticipo.
Lo faccio
//+---------------------- OnTester() --------------------------------+doubleOnTester()
{
double Result = 0;
double Profit = TesterStatistics(STAT_PROFIT);
double Drowdown = TesterStatistics(STAT_EQUITY_DD);
if(Drowdown>0)
Result = Profit/Drowdown;
else Result = 0;
return(NormalizeDouble(Result,2));
}
//+------------------------------------------------------------------+
Ciao a tutti!
Si prega di consigliare qual è il problema con il trasferimento del valore iCustom in EA.
2014.10.12 10:23:06.656 TestGenerator: errore dati non abbinati (limite di volume 470 al 2014.03.14 21:45 superato)
2014.10.12 10:23:53.468 2014.03.06 18:15 ClusterExp2 GBPUSD,M15: 2147483647 2147483647
Indicatore Correl8 su una graffetta.
Grazie in anticipo!
Carica la storia del personaggio da testare. L'errore è nei dati della storia, non in iCustom()
Buongiorno, Artyom! Sì, è chiaro che si tratta di maghi! Ma quando qualcosa non è in un ciclo, ma in condizioni di tipo if-else, sarà sufficiente mettere la prima condizione if(Symbol()==mySymbol) (senza else, ovviamente), presentando precedentemente mySymbol=Symbol()?! In modo che tutte le variabili di tutti gli EA siano le stesse, ma ognuno sul proprio grafico! Non posso ancora controllare, sto ancora scrivendo, "facendo uscire"! :)
Se la stringa mySymbol=Symbol();, allora questa variabile terrà il valore del simbolo corrente. Di conseguenza, per ogni EA che negozia sul proprio grafico, il valore di questa variabile sarà uguale al valore del simbolo, sul quale l'EA è stato lanciato.
Stampa su un file. Sto imparando a stampare su questo file.
Perché stampa degli zeri in cl_time?
Puoi dirmi come definire un prelievo sulla scheda?
Per alcuni "ordini", OrderType() produce un valore numericamente uguale a 6. Questi sono i prelievi e i depositi.
Dopo una chiamata a OrderSelect() che ha avuto successo (restituito true), si può determinare la dimensione del prelievo/ricarico dal valore restituito da OrderProfit(), e dal segno di questo valore - se è un prelievo o un deposito...
Inoltre, alcuni broker fanno pagare una tassa, imitando un prelievo per l'importo della tassa. Si può cercare di distinguere l'addebito della commissione dal prelievo dal conto con un commento ottenuto usando OrderComment().
Tuttavia, fate attenzione: tutto questo non è documentato e potrebbe smettere di funzionare in qualsiasi momento.
Cari programmatori! Quando si ottimizza un Expert Advisor, io personalmente, credo, come molti altri partecipanti, cerco di trovare il massimo rapporto tra profitto e massimo drawdown (rapporto: profitto/perdita), che credo sia l'indicatore più importante. Faccio questa procedura manualmente dopo il completamento dell'esecuzione del tester. È possibile automatizzare questo processo? Oppure, come fa ognuno di voi a determinare questo parametro? Grazie in anticipo.
Lo faccio