Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 732

 
Fox_RM:

Hola a todos.

Por favor, aclare cuál es el problema con la transferencia de valores de iCustom en el EA.

2014.10.12 10:23:06.656 TestGenerator: error de datos no coincidentes (se ha superado el límite de volumen 470 en 2014.03.14 21:45)

2014.10.12 10:23:53.468 2014.03.06 18:15 ClusterExp2 GBPUSD,M15: 2147483647 2147483647

Indicador Correl8 en un clip.

Gracias de antemano.

Cargue el historial del símbolo que está probando. Error en los datos del historial, no en iCustom()
 
artmedia70:
Sube el historial del personaje que se está probando. El error está en los datos del historial, no en iCustom()
¡¡¡Gracias!!!
 
borilunad:
¡Buenos días, Artyom! ¡Sí, está claro lo de los magos! Pero cuando algo no está en un bucle, sino en condiciones de tipo if-else, bastará con poner como primera condición if(Symbol()==miSímbolo)(sin else, por supuesto), presentando previamente miSímbolo=Símbolo()? Para que todas las variables de todos los EAs sean iguales, ¡pero cada uno en su propio gráfico! No puedo comprobarlo aún, todavía estoy escribiendo, ¡"haciéndolo"! :)
Si la cadena miSímbolo=Símbolo();, entonces esta variable contendrá el valor del símbolo actual. En consecuencia, para cada EA que opere en su propio gráfico, el valor de esta variable será igual al valor del símbolo en el que se ha lanzado el EA.
 
artmedia70:
Si la cadena miSímbolo=Símbolo();, entonces esta variable mantendrá el valor del símbolo actual. Por lo tanto, para cada EA que opere en su propio gráfico, el valor de esta variable será igual al valor del símbolo, en el que se ha lanzado el EA.
Por alguna razón, no pensé en la cuerda. Todavía estoy luchando con errores en funciones probadas que funcionan bien en otros EAs!Muchas gracias!
 

Impresión en un archivo. Estoy aprendiendo a imprimir en este archivo.

¿Por qué se imprimen ceros en 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());
}
 
¿Puede decirme cómo identificar una retirada en el tablero?
 
beginner:
¿Puede decirme cómo definir una retirada en el tablero?

Para algunos "pedidos", OrderType() produce un valor numérico igual a 6. Se trata de las retiradas y los depósitos.

Después de una llamada exitosa a OrderSelect() (devuelta como verdadera) se puede determinar el tamaño de la retirada/recarga por el valor devuelto por OrderProfit(), y por el signo de este valor - si es una retirada o un depósito...

Además, algunos corredores cobran una comisión, imitando un retiro por el monto de la comisión. Puede intentar distinguir el cobro de la comisión de la retirada de la cuenta mediante un comentario obtenido con OrderComment().

Sin embargo, ten cuidado: todo esto no está documentado y puede dejar de funcionar en cualquier momento.

 
simpleton:


Gracias.
 
Queridos programadores A la hora de optimizar un Asesor Experto, yo personalmente, creo que como muchos otros participantes, trato de encontrar la máxima relación entre el beneficio y el máximo drawdown (ratio: beneficio/pérdida), que creo que es el indicador más importante. Hago este procedimiento manualmente después de la finalización de la ejecución del probador. ¿Es posible automatizar este proceso? O bien, ¿cómo determina cada uno de ustedes este parámetro? Gracias de antemano.
 
yosuf:
Queridos programadores A la hora de optimizar un Asesor Experto, yo personalmente, creo que como muchos otros participantes, trato de encontrar la máxima relación entre el beneficio y el máximo drawdown (ratio: beneficio/pérdida), que creo que es el indicador más importante. Hago este procedimiento manualmente después de la finalización de la ejecución del probador. ¿Es posible automatizar este proceso? O bien, ¿cómo determina cada uno de ustedes este parámetro? Gracias de antemano.

Lo hago

//+---------------------- 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));
}
//+------------------------------------------------------------------+