[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 797

 

¡Compañeros! Este es mi intento # 2 para crear una herramienta milagrosa que lee ROC AUDUSD y GBPUSD para el comercio en GBPAUD) ¡¡¡Es un poco primitivo, pero tenía muchas ganas de probarlo!!! Cuando lo ejecuto en el probador sin optimizarlo, se congela, pero sigue cargando con éxito... y al final - ni un solo comercio. Bueno está claro que he metido la pata, pero donde, plz, díganme, gente entendida!!! :)) Este es un código de EA. Toma los datos de un ROC normal y corriente.

//+------------------------------------------------------------------+
//|                                                    Robot_Rocky_Rich |
//|                                                          JonsonAlla |
//|                                                    deep_ampik@bk.ru |
//+------------------------------------------------------------------+

extern double TakeProfit = 700;
extern double Sl = 200;
extern double Lots = 0.01;
             
//+------------------------------------------------------------------+
int start()
 {
  int cnt, ticket;
  double x1= iCustom("AUDUSD",PERIOD_H1,"ROC",12,1,0);
  double x2= iCustom("GBPUSD",PERIOD_H1,"ROC",12,1,0); 
  
  
     
  /**total=OrdersTotal();
  if(total<1)//проверка количества ордеров 
   {
   if(AccountFreeMargin()<(1000*Lots))
    {
     Print("Недостаточно средств = ", AccountFreeMargin());
     return(0);  
    }**/
  if (x1<x2)
   {
    ticket=OrderSend("GBPAUD",OP_BUY,Lots,Ask,30,Bid-Sl*Point,Ask+TakeProfit*Point,"-",0,0,Green);
    if(ticket>0)
     {
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("открыта позиция BUY : ",OrderOpenPrice());
     }
    else Print("Ошибка при открытии BUY позиции : ",GetLastError());          
    return(0);
   }
  if (x1>x2) 
   {
    ticket=OrderSend("GBPAUD",OP_SELL,Lots,Bid,30,Ask+Sl*Point,Bid-TakeProfit*Point,"-",0,0,Red);
    if(ticket>0)
     {
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("открыта позиция SELL : ",OrderOpenPrice());
     }
    else Print("Ошибка при открытии SELL позиции : ",GetLastError());
    return(0); 
   }
   return(0);
  }
  
 
Vinin:

IndicatorCounted() no funciona en los EAs. Sólo está destinado a los indicadores. Quizá debamos ampliar un poco el problema. Hay diferentes maneras de solucionarlo. La más fácil es optimizar el indicador (pero no siempre es posible), puede transferir los cálculos al Asesor Experto, pero de nuevo no siempre es posible. En realidad hay que mirar el indicador

Quiero trasladar el código de cálculo a un EA, en un indicador el código de cálculo comienza con un bucle...como puedo sustituirlo por uno más correcto7

int CountedBars=IndicatorCounted();
if(CountedBars< 0) CountedBars= 0;
if(CountedBars> 0) CountedBars--;
cnt = Bars - CountedBars;

for(int i = 0; i < cnt ;i++)
 
obla4ko:

¡Compañeros! Este es mi intento # 2 para crear una herramienta milagrosa que lee ROC AUDUSD y GBPUSD para el comercio en GBPAUD) ¡¡¡Es un poco primitivo, pero tenía muchas ganas de probarlo!!! Cuando lo ejecuto en el probador sin optimizarlo, se congela, pero sigue cargando con éxito... y al final - ni un solo comercio. Bueno está claro que he metido la pata, pero donde, plz, díganme, gente entendida!!! :)) Este es el código del llamado Asesor Experto, que toma los datos del ROC habitual.


Prueba con el control de carga de la historia primitiva

Archivos adjuntos:
 
Vinin:


Prueba con el control primitivo de la carga del historial

Tal vez no sea correcto sólo comparar x1 y x2, sino que debería estar unido a algo, digamos, a la última barra... Por lógica del indicador, el EA debería abrir al menos una posición y no cerrarla, porque el cierre no está implementado en el programa :)), y el ROC de una divisa es siempre mayor que el ROC de la otra...

 

Tal vez la llamada del indicador no es del todo correcta. Tendré que buscarlo yo mismo. Parece que el buffer debería ser cero, no el primero.

 

No tengo ese indicador

 
T-G:

Quiero transferir el código de cálculo al Asesor Experto, el código de cálculo en el indicador comienza con un bucle...cómo puedo sustituirlo por uno más correcto7

1. Por qué?????????????????????

Pero, si realmente lo necesitas, entonces

2. ¿Por qué carajo estoy respondiendo a nada? Te lo dije - hay un artículo de Kositsyn sobre esto en los artículos (está aquí, enlace arriba). ¿Cuántas veces tengo que repetírtelo? ¿Tal vez tienes algo más que hacer?

 
Vinin:

No tengo ese indicador

Este es el código del indicador ROC

//+------------------------------------------------------------------+
//|                                                          ROC.mq4 |
//|                                    Copyright © 2006, Robert Hill |
//+------------------------------------------------------------------+

#property  copyright "Copyright © 2006, Robert Hill"
//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 1
#property  indicator_color1  Red
//---- indicator parameters
extern int RPeriod = 12;
extern bool UsePercent = true;
//---- indicator buffers
double RateOfChange[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- drawing settings
   SetIndexStyle(0, DRAW_LINE);
   SetIndexDrawBegin(0, RPeriod);
   IndicatorDigits(Digits + 1);
//---- indicator buffers mapping
   if(!SetIndexBuffer(0, RateOfChange))
       Print("cannot set indicator buffers!");
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("ROC(" + RPeriod + ")");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   double ROC, CurrentClose, PrevClose;
   int counted_bars = IndicatorCounted();
//---- check for possible errors
   if(counted_bars < 0) 
       return(-1);
//---- last counted bar will be recounted
   if(counted_bars > 0) 
       counted_bars--;
   limit = Bars - counted_bars - RPeriod;
//---- ROC calculation
   for(int i = 0; i < limit; i++)
     {
       CurrentClose = iClose(NULL, 0, i);
       PrevClose = iClose(NULL, 0, i + RPeriod);
       ROC = CurrentClose - PrevClose;
       //----
       if(UsePercent)
         {
           if(PrevClose != 0)
               RateOfChange[i] = 100 * ROC / PrevClose;
         }
       else
           RateOfChange[i] = ROC;
     }   
//---- done
   return(0);
  }
//+------------------------------------------------------------------+
 

"¿No hay que fregar el suelo? ¡Voy a venir a lavarlos! " (с)

Aquí está la transferencia del código del indicador al código del Experto.

 
obla4ko:

Este es el código del indicador ROC


Hay un error en el código del indicador.