Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 732

 
Fox_RM:

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!

Carregue o histórico para o símbolo que você está testando. Erro nos dados do histórico, não no iCustom()
 
artmedia70:
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()
Obrigado!!!
 
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!
 

Impressão em um arquivo. Estou aprendendo a imprimir neste arquivo.

Por que ele imprime zeros no tempo cl_time ?

1,37243 1,37253 -1 07:27:13 00:00:00
1,37248 1,37256 -1 07:57:21 00:00:00
1,37256 1,37256 -1 08:17:30 00:00:00
1,37266 1,37268 -1 08:48:11 00:00:00
1,37267 1,37293 -1 08:53:15 00:00:00
1,37269 1,37307 1 09:17:57 00:00:00
1,37275 1,3727 1 10:23:02 00:00:00
1,37269 1,37269 1 10:28:03 00:00:00
1,37268 1,37231 1 10:33:10 00:00:00
1,37278 1,37255 1 10:57:38 00:00:00
1,37256 1,37269 -1 11:02:42 00:00:00
1,37268 1,37284 1 11:07:45 00:00:00
1,37283 1,37307 -1 11:12:49 00:00:00
1,37314 1,37335 1 12:11:37 00:00:00
1,37317 1,37323 1 12:23:12 00:00:00
1,37324 1,37326 1 12:28:20 00:00:00
1,37396 1,37415 1 13:26:32 00:00:00
1,37413 1,37419 1 13:37:20 00:00:00
1,3744 1,37578 1 13:56:29 00:00:00

//+------------------------------------------------------------------+
//|                                                    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 strict

input double Lots                   =0.1;

input int Expiration           =5; //laikas minutemis

//---- input parameters
input int cci_p                     = 89;
input int ma                        = 13;
input int NumberOfBarsToCalculate   = 100;

input string   comment=".csv  or  .txt";//коментарий
input string   FileType="csv";//тип файла 

datetime op_time=0,cl_time=0;
double  op_price=0,cl_price=0;
int op_type=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick(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 variables
   double 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) possibility
      if(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);
           }
         else
            Print("Error opening BUY order : ",GetLastError());
         return;
        }
      //--- check for short position (SELL) possibility
      if(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);
           }
         else
            Print("Error opening SELL order : ",GetLastError());
        }
      //--- exit from the "no opened orders" block
      return;
     }
//--- 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 opened
         if(OrderType()==OP_BUY)
           {
            //--- should it be closed?
            if(TimeCurrent()>=op_time+Expiration*60)
              {
               //--- close order and exit
               if(!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 exit
               if(!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);
               }
               else
               PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",fileName,GetLastError());
}
 
Você pode me dizer como identificar uma retirada no quadro?
 
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.

 
simpleton:


Obrigado!
 
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() --------------------------------+
double OnTester()
{
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));
}
//+------------------------------------------------------------------+