borilunad: Bom dia, Artyom! Sim, está claro sobre os mágicos! Mas quando algo não está em loop, mas em condições do tipo if-else, será suficiente apenas colocar a primeira condição if(Symbol()==mySymbol)(sem outra, é claro), apresentando previamente mySymbol=Symbol()?! Para que todas as variáveis de todos os EAs sejam as mesmas, mas cada uma em seu próprio gráfico! Ainda não posso checar, ainda estou escrevendo, "fazendo"! :)
Se string mySymbol=Symbol(); então, esta variável conterá o valor do símbolo atual. Assim, para cada EA, que comercializa em seu próprio gráfico, o valor desta variável será igual ao valor do símbolo, sobre o qual a EA foi lançada.
artmedia70: Se string mySymbol=Symbol(); então, esta variável manterá o valor do símbolo atual. Assim, para cada EA que comercializa em seu próprio gráfico, o valor desta variável será igual ao valor do símbolo, sobre o qual a EA foi lançada.
De alguma forma, eu não pensei no fio! Ainda estou lutando com erros em funções testadas que funcionam bem em outros EAs! Muitoobrigado!
//+------------------------------------------------------------------+//| 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: Você pode me dizer como definir uma retirada no quadro?
Para alguns "pedidos", OrderType() produz um valor numericamente igual a 6. Estes são os saques e depósitos.
Após uma chamada OrderSelect() bem sucedida, você pode determinar o tamanho da retirada/carga pelo valor retornado da OrderProfit(), e pelo sinal deste valor - se é uma retirada ou um depósito...
Além disso, alguns corretores cobram uma comissão, imitando uma retirada pelo valor da comissão. Você pode tentar distinguir a cobrança de comissão da retirada da conta através de um comentário obtido usando OrderComment().
Entretanto, tenha cuidado: tudo isso é indocumentado e pode parar de funcionar a qualquer momento.
Caros programadores! Ao otimizar um Expert Advisor, eu pessoalmente, como muitos outros participantes, penso que tento encontrar a relação máxima de lucro para o máximo drawdown (relação: lucro/perda), que eu acho que é o indicador mais importante. Faço este procedimento manualmente após a conclusão da corrida do testador. É possível automatizar este processo? Ou, como cada um de vocês determina este parâmetro? Agradecemos antecipadamente.
yosuf: Caros programadores! Ao otimizar um Expert Advisor, eu pessoalmente, como muitos outros participantes, penso que tento encontrar a relação máxima de lucro para o máximo drawdown (relação: lucro/perda), que eu acho que é o indicador mais importante. Faço este procedimento manualmente após a conclusão da corrida do testador. É possível automatizar este processo? Ou, como cada um de vocês determina este parâmetro? Agradecemos antecipadamente.
Eu o faço
//+---------------------- 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));
}
//+------------------------------------------------------------------+
Olá a todos!
Por favor, informe qual é o problema com a transferência de valor do iCustom na EA.
2014.10.12 10:23:06.656 TestGenerator: erro de dados incomparável (limite de volume 470 em 2014.03.14 21:45 excedido)
2014.10.12 10:23:53.468 2014.03.06 18:15 ClusterExp2 GBPUSD,M15: 2147483647 2147483647
Indicador Correl8 em um clipe de papel.
Agradecemos antecipadamente!
Faça o upload do histórico do personagem que está sendo testado. O erro está nos dados do histórico, não no iCustom()
Bom dia, Artyom! Sim, está claro sobre os mágicos! Mas quando algo não está em loop, mas em condições do tipo if-else, será suficiente apenas colocar a primeira condição if(Symbol()==mySymbol)(sem outra, é claro), apresentando previamente mySymbol=Symbol()?! Para que todas as variáveis de todos os EAs sejam as mesmas, mas cada uma em seu próprio gráfico! Ainda não posso checar, ainda estou escrevendo, "fazendo"! :)
Se string mySymbol=Symbol(); então, esta variável manterá o valor do símbolo atual. Assim, para cada EA que comercializa em seu próprio gráfico, o valor desta variável será igual ao valor do símbolo, sobre o qual a EA foi lançada.
Impressão em um arquivo. Estou aprendendo a imprimir neste arquivo.
Por que ele imprime zeros no tempo cl_time ?
Você pode me dizer como definir uma retirada no quadro?
Para alguns "pedidos", OrderType() produz um valor numericamente igual a 6. Estes são os saques e depósitos.
Após uma chamada OrderSelect() bem sucedida, você pode determinar o tamanho da retirada/carga pelo valor retornado da OrderProfit(), e pelo sinal deste valor - se é uma retirada ou um depósito...
Além disso, alguns corretores cobram uma comissão, imitando uma retirada pelo valor da comissão. Você pode tentar distinguir a cobrança de comissão da retirada da conta através de um comentário obtido usando OrderComment().
Entretanto, tenha cuidado: tudo isso é indocumentado e pode parar de funcionar a qualquer momento.
Caros programadores! Ao otimizar um Expert Advisor, eu pessoalmente, como muitos outros participantes, penso que tento encontrar a relação máxima de lucro para o máximo drawdown (relação: lucro/perda), que eu acho que é o indicador mais importante. Faço este procedimento manualmente após a conclusão da corrida do testador. É possível automatizar este processo? Ou, como cada um de vocês determina este parâmetro? Agradecemos antecipadamente.
Eu o faço