[ARCHIVO] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 3. - página 546

 

El EA tiene el siguiente bloque (Contador de Eventos):

if (isCloseLastPosByStop()==True) //Si la última orden fue cerrada por Stop

{
N=N+1;
Alerta(N, " alce");
} si no N=0;

PREGUNTA: ¿cómo escribir los datos en un archivo (Excel) en lugar de mostrarlos en la pantalla?

 
Dimka-novitsek:

Buenas tardes, me podrían decir como puede ser, selecciono un pedido en un bucle, paso por cual es el último pedido y lo recuerdo así ticket = OrderTicket();

En este caso digamos que es el número dos. Un poco más tarde si (ticket>-1){
OrderSelect(ticket,SELECT_BY_TICKET,MODE_HISTORY);

y a menudo recibo el error 4105 - ¡¡¡Orden no seleccionada!!!


Y es que el pedido aún no se ha cerrado. No está en MODE_HISTORY, sigue en MODE_TRADES.
 

for(  i=0;i<=OrdersHistoryTotal();i++){
    OrderSelect(i ,SELECT_BY_POS,MODE_HISTORY);
     if (OrderMagicNumber( )== magic) { if(OrderSymbol()== Symbol()) {





 current = OrderOpenTime();  Alert ( " current = OrderOpenTime(); ",  current);Alert ( " max ", max );
      
      if (current > max) 
      {                    
         max = current;      
         ticket = OrderTicket();   Alert ( " ticket = OrderTicket();  ", ticket );
      }}}}


       if (ticket>-1){
      OrderSelect( ticket,SELECT_BY_TICKET,MODE_HISTORY);Alert ("SELL Select error HISTORYticket ", GetLastError( )  ) ;

¡No puede ser! ¿Por qué no? No había órdenes abiertas en el momento del rebasamiento. Tal vez no lo entienda.

¡El ciclo de búsqueda también está en la historia! ¡Ahí es donde lo asigno a la variable int ticket!

Y jura, perdón, 2012.02.04 11:28:47 2011.12.06 16:35 GMT EURUSD,M30: Alerta: SELL error HISTORYticket 4105

¿Cuándo se pasa de MODE_HISTORY a MODE_TRADES?

Y lo más importante, selecciono la misma orden en el historial con la ayuda de order select, y queda seleccionada en primer lugar, de lo contrario no podría trabajar con ella. No tiene ninguna lógica !!!!!! Estoy sorprendido...




 
Dimka-novitsek:

¡No puede ser! ¿Por qué no? No había órdenes abiertas en el momento del rebasamiento. Tal vez no lo entienda.

¡El ciclo de búsqueda también está en la historia! ¡Ahí es donde lo asigno a la variable int ticket!

Y jura, perdón, 2012.02.04 11:28:47 2011.12.06 16:35 GMT EURUSD,M30: Alerta: SELL error HISTORYticket 4105

¿Cuándo se pasa de MODE_HISTORY a MODE_TRADES?


ticket=-1;
for(  i=0;i<OrdersHistoryTotal();i++){
    if (OrderSelect(i ,SELECT_BY_POS,MODE_HISTORY));{
     if (OrderMagicNumber( )== magic) { if(OrderSymbol()== Symbol()) {





 current = OrderOpenTime();  Alert ( " current = OrderOpenTime(); ",  current);Alert ( " max ", max );
      
      if (current > max) 
      {                    
         max = current;      
         ticket = OrderTicket();   Alert ( " ticket = OrderTicket();  ", ticket );
      }}}}}


       if (ticket>-1){
      OrderSelect( ticket,SELECT_BY_TICKETJ ,MODE_HISTORY);Alert ("SELL Select error HISTORYticket ", GetLastError( )  ) ;
Se ha añadido una línea al principio y se han corregido las dos líneas de código siguientes.
 
¡¡¡Gracias!!!
 

ayudar a insertar un stop loss en un EA

por favor

Archivos adjuntos:
my_1.mq4  10 kb
 
Por favor, comparta la función para calcular el lote máximo permitido, teniendo en cuenta las posiciones abiertas, es decir, el patrimonio. La función estándar calcula el riesgo, pero si hay operaciones, no hay suficiente dinero para abrirlas
 
T-G:
Por favor, comparta la función para calcular el lote máximo permitido, teniendo en cuenta las posiciones abiertas, es decir, el patrimonio. La función estándar calcula el riesgo, pero si hay operaciones, no hay suficiente dinero para abrirlas


En el caso más sencillo es así:

double Klots = 0.1; //коэфф. риска (определяет желаемый размер лота от максимально возможного в данный момент.)

Lots=NormalizeDouble(Klots*AccountFreeMargin()/MarketInfo(Symbol(),MODE_MARGINREQUIRED),2);Lots=MathMax(MarketInfo(Symbol(),MODE_MINLOT),Lots);
 

Chicos, ¿podéis aconsejarme sobre esta cuestión?

Aquí hay un script para encontrar el tamaño máximo de la holgura en zig-zag de crenfx - ver aquí:

#property show_inputs

extern int MinPips = 100;
extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';

#define MAX_POINTS 10000

// Заполняет массив размерами колен ЗигЗага с условием колена >= MinPips пунктов
int GetZigZagData( int MinPips, datetime& StartTime, datetime& EndTime, int& Data[] )
{
  bool FlagUP = TRUE;
  int Pos = iBarShift(Symbol(), Period(), StartTime);
  int PosEnd = iBarShift(Symbol(), Period(), EndTime);
  int Max = High[Pos] / Point + 0.1;
  int Min = Low[Pos] / Point + 0.1;
  int Count = 0;
  int PriceHigh, PriceLow;
 
  StartTime = Time[Pos];
  EndTime = Time[PosEnd];
  
  ArrayResize(Data, MAX_POINTS);

  Pos--;
  
  while (Pos >= PosEnd)
  {
    PriceHigh = High[Pos] / Point + 0.1;
    PriceLow = Low[Pos] / Point + 0.1;   

    if (FlagUP)
    {
      if (PriceHigh > Max)
        Max = PriceHigh;
      else if (Max - PriceLow >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = FALSE;
        Min = PriceLow;
      }
    }
    else
    {
      if (PriceLow < Min)
        Min = PriceLow;
      else if (PriceHigh - Min >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = TRUE;
        Max = PriceHigh;
      }
    }
    
    Pos--;
  }
  
  ArrayResize(Data, Count);
    
  return(Count);
}

void start()
{
  int ZigZagData[];
  int Amount = GetZigZagData(MinPips, StartTime, EndTime, ZigZagData);
  
  ArraySort(ZigZagData);
  
  Print("На интервале " + TimeToStr(StartTime) + " - " + TimeToStr(EndTime) +
        " максимальное безоткатное (> " + MinPips +
        " пунктов) движение " + ZigZagData[Amount - 1] + " пунктов.");
        
  return;
}

Lo tiro en el gráfico del instrumento en M5 - funciona bien con el marco de tiempo por defecto

extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';

es la profundidad máxima del historial del símbolo en la oficina de Alpari al cargarlo con F2 - lo he comprobado, es decir, se parece al contenido de la pestaña "Expertos" del terminal del cliente - parece ser cierto:

Al utilizar el mismo diseño de script en mi EA en el mismo intervalo de tiempo en el mismo período de gráfico M5 no cuenta correctamente, es decir.

calcula números bastante diferentes (más pequeños que en el script) o 0. ¿Cuál puede ser el error o puede ser algún tipo de inconsistencia en la historia? Gracias.

Es decir, empiezo en el tester con owl después del tiempo estimado para encontrar un failsafe, en teoría todo es normal y los números al final del script y de owl deberían ser los mismos... ¿Cuál puede ser el error?

 

Así es como cargo este script a mi búho:

extern string A3 = "Расчет безотката";
//РАСЧЕТ БЕЗОТКАТА ДЛЯ РАССТАВЛЕНИЯ ОРДЕРОВ С ЗАДАННЫМ ШАГОМ
extern int MinPips = 100;
extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';
#define MAX_POINTS 1000000

//extern double grid = 1000;          // размер безотката в пунктах



//+------------------------------------------------------------------+
//| Старт робота                                                     |
//+------------------------------------------------------------------+

int init()
{   
       
  //------------------     ШАГ СЕТКИ   ---------------------------------------------------------------------------------------

 //Pipstep = grid/Max_Iteration;
 //Pipstep = NormalizeDouble(Pipstep,0);  
 // СЧИТАЕМ БЕЗОТКАТ
    int ZigZagData[];
    int Amount = GetZigZagData(MinPips, StartTime, EndTime, ZigZagData);
  
    ArraySort(ZigZagData);
  
    Print("На интервале " + TimeToStr(StartTime) + " - " + TimeToStr(EndTime) +
        " максимальное безоткатное (> " + MinPips +
        " пунктов) движение " + ZigZagData[Amount - 1] + " пунктов.");        

  
   
    return (0);
}

...
...

// Заполняет массив размерами колен ЗигЗага с условием колена >= MinPips пунктов
int GetZigZagData( int MinPips, datetime& StartTime, datetime& EndTime, int& Data[] )
{
  bool FlagUP = TRUE;
  int Pos = iBarShift(Symbol(), Period(), StartTime);
  int PosEnd = iBarShift(Symbol(), Period(), EndTime);
  int Max = High[Pos] / Point + 0.1;
  int Min = Low[Pos] / Point + 0.1;
  int Count = 0;
  int PriceHigh, PriceLow;
 
  StartTime = Time[Pos];
  EndTime = Time[PosEnd];
  
  ArrayResize(Data, MAX_POINTS);

  Pos--;
  
  while (Pos >= PosEnd)
  {
    PriceHigh = High[Pos] / Point + 0.1;
    PriceLow = Low[Pos] / Point + 0.1;   

    if (FlagUP)
    {
      if (PriceHigh > Max)
        Max = PriceHigh;
      else if (Max - PriceLow >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = FALSE;
        Min = PriceLow;
      }
    }
    else
    {
      if (PriceLow < Min)
        Min = PriceLow;
      else if (PriceHigh - Min >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = TRUE;
        Max = PriceHigh;
      }
    }
    
    Pos--;
  }
  
  ArrayResize(Data, Count);
    
  return(Count);
}

Parece que todo es igual, ¿cuál puede ser el error?