[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 270

 
hoz:


No me refería a que el parámetrofi_Ticket no sea necesario, sino a por qué estaba puesto a 0 (cero) por defecto. Yo lo haría así:

Voy aduplicar el código fuente de nuevo:

Esta función permite obtener información comercial por un instrumento (sin vinculación a una orden, por ejemplo, antes de abrir una orden) y lo mismo, pero en conjunto con una orden específica (cuando es seguida por una orden). El valor por defecto se utiliza para facilitar el uso de la función. El valor negativo de fi_Ticket se utiliza al inicializar la biblioteca comercial.

P.D. Y en primer lugar, presta atención a los nombres de las variables, o más exactamente a sus prefijos. Las variables que tienen una b inicial, como bs_Symbol se declaran globalmente desde la biblioteca. La mayoría de las variables globales se declaran en b-PSI@Base.

 

Por favor, mira el código de EA, no puedo averiguar cuál es la razón.... Al iniciar por primera vez las operaciones puede abrir un comercio de inmediato, pero después de cerrar deja de funcionar hasta el próximo reinicio de la terminal o de encendido / apagado permiten EA para el comercio... Funciona con el indicador Gann 2.0

extern string     s0                = "Setup: Main";
extern int        Magic             = 1121;
extern double     lots              = 0.1;
extern int        StopLoss          = 70;
extern int        TakeProfit        = 140;
extern bool       UseTrail          = true;
extern bool       TrailWhileMinus   = false;
extern int        Trail             = 70;

extern string     s1                = "Setup: GANN indicator";
extern bool UseBeginDate = false;
extern string BeginDate = "2010.01.01 00:00";
extern int nBarsBack = 120;//250;
extern string prices = "0=close, 4=median, 5=typical";
extern int Price_Mode = 5;
extern bool Show_GridMatrix = false;
extern bool Show_GannGrid = false;
extern bool Show_HiloArrows = true;
extern bool Show_PriceArrows = true;
extern bool Show_Comments = false;
extern string ____MainGrid____ = "ooo";
extern color MainGrid_Color = Silver;//Green;//Sienna;
extern int MainGrid_Style = STYLE_DOT;
extern int MinMaxGrid_Style = STYLE_SOLID;
extern int MainGrid_Width = 1;
extern int fontSize = 8;
extern bool Draw_AllGrids = false;
extern bool Draw_AdditionalGrids = false;
extern string ____GannGrid____ = "ttt";
extern color GannGrid_Color = Silver;//Gray;
extern int GannGrid_Style = STYLE_DOT;
extern int GannGrid_Width = 177;
extern string ____Default_GridParameters____ = "Recomanded GridInterval 35 or 36";
extern int MainGrid_Intervals = 3677;   //default=35(!)
extern double GannGrid_Interval = 8.0;//with default 8.5 is the time interval not OK; and 9 is too large
extern int Text_Shift = 50;

//s1, UseBeginDate, BeginDate, nBarsBack, prices, Price_Mode, Show_GridMatrix, Show_GannGrid, Show_HiloArrows, Show_PriceArrows, Show_Comments, ____MainGrid____, MainGrid_Style, MinMaxGrid_Style, MainGrid_Width, fontSize, Draw_AllGrids, Draw_AdditionalGrids, ____GannGrid____, GannGrid_Style, GannGrid_Width, ____Default_GridParameters____, MainGrid_Intervals, GannGrid_Interval, Text_Shift

int               slip              = 3;

int Ticket[1000];

void deinit() 
{
   SemaphoreDeinit("TRADECONTEXT");

   return(0);
}


int start()
{
   static datetime TimeFlag = 0;
   datetime        TimeLast = Time[0];
   if(TimeFlag < TimeLast)
   {
      TimeFlag = TimeLast;
      
      int GANN = GetSignal_GANN();
      
      AnalyzeSignals(GANN);
      
      if(UseTrail == true) TrailAllOrders();
   }
   return(0);
}



void AnalyzeSignals(int GANN)
{
   static int ticket = 0;
   int sig = -1;
   bool res;
   
   ticket = RefreshTicket(ticket);
   
   if(GANN == OP_BUY)
      sig = OP_BUY;
   else if(GANN == OP_SELL)
      sig = OP_SELL;   

   if(ticket != 0)
   {
      OrderSelect(ticket, SELECT_BY_TICKET);      
      int type = OrderType();
      
      if(sig == OP_BUY && type == OP_SELL)
      {
         SemaphoreTake("TRADECONTEXT"); 
         res = OrderClose(ticket, OrderLots(), Ask, slip);
         SemaphoreReturn("TRADECONTEXT");
         if(!res) {Alert("OrderClose Error: ", GetLastError());}
         else ticket = 0;
      }
   
      else if(sig == OP_SELL && type == OP_BUY)
      {
         SemaphoreTake("TRADECONTEXT"); 
         res = OrderClose(ticket, OrderLots(), Bid, slip);
         SemaphoreReturn("TRADECONTEXT");
         if(!res) {Alert("OrderClose Error: ", GetLastError());}
         else ticket = 0;
      } 
   }   
   
   
   if(ticket == 0)
   {   
      double _lot = lots;
   
      if(sig == OP_BUY)
      {
         SemaphoreTake("TRADECONTEXT"); 
         ticket = OrderSend(Symbol(), OP_BUY, _lot, Ask, slip, Bid - StopLoss*Point, Bid + TakeProfit*Point, NULL, Magic);
         SemaphoreReturn("TRADECONTEXT");
         if(ticket < 0) {Alert("OrderSend Error: ", GetLastError());}
      }
   
      else if(sig == OP_SELL)
      {
         SemaphoreTake("TRADECONTEXT");
         ticket = OrderSend(Symbol(), OP_SELL, _lot, Bid, slip, Ask + StopLoss*Point, Ask - TakeProfit*Point, NULL, Magic);
         SemaphoreReturn("TRADECONTEXT");
         if(ticket < 0) {Alert("OrderSend Error: ", GetLastError());}
      }
   }
}

int RefreshTicket(int ticket)
{
   bool res;
   
   if(ticket <= 0)
      return(0);
   else
   {
      res = OrderSelect(ticket, SELECT_BY_TICKET);
      if(!res)
         return(0);
      else if(OrderCloseTime() != 0)
         return(0);
   }
   
   return(ticket);      //all ok, ticket still valid
}

int GetSignal_GANN()
{
   //Alert("!!: ", s1, ";", UseBeginDate, ";", BeginDate, ";", nBarsBack, ";", prices, ";", Price_Mode, ";", Show_GridMatrix, ";", Show_GannGrid, ";", Show_HiloArrows, ";", Show_PriceArrows, ";", Show_Comments, ";", ____MainGrid____, ";", MainGrid_Color, ";", MainGrid_Style, ";", MinMaxGrid_Style, ";", MainGrid_Width, ";", fontSize, ";", Draw_AllGrids, ";", Draw_AdditionalGrids, ";", ____GannGrid____, ";", GannGrid_Color, ";", GannGrid_Style, ";", GannGrid_Width, ";", ____Default_GridParameters____, ";", MainGrid_Intervals, ";", GannGrid_Interval, ";", Text_Shift);

   double ga_up = iCustom(NULL, 0, "Gann v2.0", s1, UseBeginDate, BeginDate, nBarsBack, prices, Price_Mode, Show_GridMatrix, Show_GannGrid, Show_HiloArrows, Show_PriceArrows, Show_Comments, ____MainGrid____, MainGrid_Color, MainGrid_Style, MinMaxGrid_Style, MainGrid_Width, fontSize, Draw_AllGrids, Draw_AdditionalGrids, ____GannGrid____, GannGrid_Color, GannGrid_Style, GannGrid_Width, ____Default_GridParameters____, MainGrid_Intervals, GannGrid_Interval, Text_Shift, 
                                          4, 0);
  
   double ga_dn = iCustom(NULL, 0, "Gann v2.0", s1, UseBeginDate, BeginDate, nBarsBack, prices, Price_Mode, Show_GridMatrix, Show_GannGrid, Show_HiloArrows, Show_PriceArrows, Show_Comments, ____MainGrid____, MainGrid_Color, MainGrid_Style, MinMaxGrid_Style, MainGrid_Width, fontSize, Draw_AllGrids, Draw_AdditionalGrids, ____GannGrid____, GannGrid_Color, GannGrid_Style, GannGrid_Width, ____Default_GridParameters____, MainGrid_Intervals, GannGrid_Interval, Text_Shift, 
                                          6, 0); 

   Print("ga_up = ", ga_up);
   Print("ga_dn = ", ga_dn);
   
   if(ga_up > 0.0)
      return(OP_BUY);
   else if(ga_dn > 0.0)
      return(OP_SELL);
   else
      return(-1);   
}


int TrailAllOrders()
{
   int i, total;
   
   total = CreateTicketArray(OP_BUY, Magic);
   for(i=0; i<total; i++)
      TrailingStop(Ticket[i]);

   total = CreateTicketArray(OP_SELL, Magic);
   for(i=0; i<total; i++)
      TrailingStop(Ticket[i]);
}

void TrailingStop(int ticket)
{
   int res;
   OrderSelect(ticket, SELECT_BY_TICKET);
   
   if(OrderType() == OP_BUY)
      if(TrailWhileMinus == true || Bid-OrderOpenPrice()>Point*Trail)         //не тралим, пока не можем достичь безубытка первым переносом стопа   
         if(Bid - OrderStopLoss() > Trail*Point)
         {
            SemaphoreTake("TRADECONTEXT");
            res = OrderModify(OrderTicket(), 0, Bid - Trail*Point, OrderTakeProfit(), 0);
            SemaphoreReturn("TRADECONTEXT"); 
            if(res<0)
               Alert("TrailingStop OrderModify Error: ", GetLastError());
        }
         
   if(OrderType() == OP_SELL)
      if(TrailWhileMinus == true || OrderOpenPrice()-Ask>Point*Trail)         //не тралим, пока не можем достичь безубытка первым переносом стопа
         if(OrderStopLoss() - Ask > Trail*Point)
         {
            SemaphoreTake("TRADECONTEXT");
            res = OrderModify(OrderTicket(), 0, Ask + Trail*Point, OrderTakeProfit(), 0);
            SemaphoreReturn("TRADECONTEXT");        
            if(res<0)
               Alert("TrailingStop OrderModify Error: ", GetLastError());
         }
}

int CreateTicketArray(int dir, int SysID)
{
   int total=OrdersTotal(), i, c=0; if (total<=0) return (0);
        for(i=0;i<total;i++) { OrderSelect(i, SELECT_BY_POS); if ((OrderType()==dir) && (OrderMagicNumber()==SysID)) { Ticket[c] = OrderTicket(); c++; } }
        return (c);
}

//------------------------------------------SEMAPHORE------------------------------------------

int critical = 0; 

void SemaphoreTake(string SEM)
{ 
   if(GlobalVariableCheck(SEM) == false)
      GlobalVariableSet(SEM, 0);
  
   while(1==1)
   {
      if(GlobalVariableSetOnCondition(SEM, 1.0, 0.0))         //получили доступ
      {
         critical = 1;
         Print("SEMAPHORE \"", SEM, "\" TAKEN. CURRENT VALUE: ", GlobalVariableGet(SEM));
         break;      //выходим из цикла ожидания доступа
      }
      else
      {
         Print("ATTEMPT TO CAPTURE SEMAPHORE \"", SEM, "\" FAILED. SEMAPHORE BUSY. WAITING 0.1 SEC. CURRENT VALUE: ", GlobalVariableGet(SEM));
         Sleep(100);
      }
   }
} 

void SemaphoreReturn(string SEM)
{
   GlobalVariableSet(SEM, 0.0);
   Print("SEMAPHORE \"", SEM, "\" RETURNED. CURRENT VALUE: ", GlobalVariableGet(SEM));
   critical = 0;
}

void SemaphoreDeinit(string SEM)    //Вставить в ф-ю  deinit()
{
   if(critical == 1)
   {
      GlobalVariableSet(SEM,      0.0);    //на случай, если советника убивают, пока он в процессе посылки запроса
   }  
}
 
chief2000:
Aquí hay un ejemplo de la documentación de un comando que le ayudará - a averiguar cómo funciona, cambiar los parámetros:

High[iHighest(NULL,0,MODE_HIGH,20,4)];
Low[iLowest(NULL,0,MODE_LOW,10,10)];


GRACIAS
 
chief2000:
Aquí hay un ejemplo de la documentación de un comando que le ayudará - a averiguar cómo funciona, cambiar los parámetros:

High[iHighest(NULL,0,MODE_HIGH,20,4)];
Low[iLowest(NULL,0,MODE_LOW,10,10)];


Siento el retraso en mi respuesta, he tenido problemas con mi ordenador.
 
chief2000:
Aquí hay un ejemplo de la documentación de un comando que le ayudará - a averiguar cómo funciona, cambiar los parámetros:

High[iHighest(NULL,0,MODE_HIGH,20,4)];
Low[iLowest(NULL,0,MODE_LOW,10,10)];


Siento el retraso en mi respuesta, he tenido problemas con mi ordenador.
 
al7bar:

Por favor, mira el código de EA, no puedo averiguar cuál es la razón.... Al iniciar por primera vez las operaciones puede abrir un comercio de inmediato, pero después de cerrar deja de funcionar hasta el próximo reinicio de la terminal o de encendido / apagado permiten EA para el comercio... Funciona con el indicador Gann 2.0

No se ven errores lógicos evidentes. Por favor, imprima el código paso a paso. El procedimiento de negociación está ligado al valor de la variable del ticket. En primer lugar, rastrea sus cambios. Preste también atención al valor de la variable global "TRADECONTEXT" - su valor debe ser 0.
 
TarasBY:

Esta función le permite obtener información comercial de un instrumento (sin vincularlo a una orden, por ejemplo, antes de abrir una orden) y lo mismo, pero en conjunto con una orden específica (cuando la acompaña). El valor por defecto se utiliza para facilitar el uso de la función. El valor negativo de fi_Ticket se utiliza al inicializar la biblioteca comercial.

P.D. Y en primer lugar, presta atención a los nombres de las variables, o más exactamente a sus prefijos. Las variables que tienen una b inicial, como bs_Symbol se declaran globalmente desde la biblioteca. La mayoría de las variables globales se declaran en b-PSI@Base.


Igor, lo entiendo. Pero la cuestión es que, según tengo entendido, para obtener información de mercado de un determinado símbolo, no necesitamos vincularlo a una orden en absoluto. Si hay un instrumento, no se necesita una orden... No es necesario en absoluto. Al fin y al cabo, sólo se necesita el nombre del instrumento para obtener información sobre el mercado. ¿No estás de acuerdo?

Esta variable por la que preguntababs_Symbol se menciona por primera vez en la inclusión de b-PSY@Base.mqh, aquí está la cadena:

  bs_Symbol,                            // текущий инструмент

Pero, no se le asigna nada. Entonces:

if (fs_Symbol != bs_Symbol || fi_Ticket < 0)

Hay una expresión:

fs_Symbol != bs_Symbol

Debería entenderse como:fs_Symbol != 0¿verdad?

TarasBY:

P.D. Y en primer lugar, presta atención a los nombres de las variables, o más exactamente, a sus prefijos. Las variables que tienen una b inicial, como bs_Symbol se declaran globalmente desde la biblioteca. La mayoría de las variables globales se declaran en b-PSI@Base.


Hm. Suelo utilizar g_ para denotar variables globales (de la palabra global). ¿Utilizas l(por ejemplo li_cnt) para significar variables locales?
 

¡Amigos! Necesito ayuda para afinar un EA.

Tenemos un código que abre una orden bajo cierta condición "if". La ejecución de la condición puede tener lugar cada tick porque se coloca en el cuerpo de int start().

Necesitamos:

1. Después de la ejecución de una condición (y la apertura de una orden), debemos hacer una pausa para la apertura de nuevas órdenes, pausa de n barras. Por ejemplo, si mi Asesor Experto está en el marco de tiempo M30 y necesito que pasen 3 horas, entonces la pausa debe ser de 6 barras.

2. El programa debería funcionar en el probador de estrategias.

¿Qué código se necesita? Y dónde sería el lugar adecuado para insertarlo.

int start()
  { 
   ...

   if (...)                                                          //условие
      {
       OrderSend(Symbol(),OP_BUY,lot,Ask,0,0,0,"Order BUY",0,0);     //открытие ордера
       ...
      }

   ...
  }
 
hoz:


Igor, lo entiendo. Pero la cuestión es que, según tengo entendido, para obtener información de mercado sobre un determinado instrumento, no es necesario vincularlo a una orden en absoluto. Si hay un instrumento, no se necesita una orden... No es necesario en absoluto. Al fin y al cabo, sólo necesita el nombre del instrumento para obtener información sobre el mercado. ¿No estás de acuerdo?

Esta variable por la que preguntababs_Symbol se menciona por primera vez en la inclusión de b-PSY@Base.mqh, aquí está la cadena:

Pero, no se le asigna nada. Entonces:

Hay una expresión:

Debería entenderse como:fs_Symbol != 0¿verdad?


Suelo utilizar g_ para denotar variables globales (de la palabra global) y l(por ejemplo, li_cnt) para significar local...

Todavía tienes mucho que aprender. Hasta ahora sus suposiciones no son ciertas. Mis funciones pueden servir para diferentes propósitos al mismo tiempo (para reducir el código en sí), en particular fGet_MarketInfo(). Todo está pensado repetidamente y no hay que cambiar nada.

Comience, por ejemplo, con un experimento: declare una variable global en el cuerpo de la EA e intente llamar a esta variable desde la biblioteca enlazada. Intente vincular los resultados a nombres de variables que tengan un prefijo que empiece por b, por ejemplo bs_Symbol.

P.D. No necesito que me revisen: o usas mis bibliotecas, o no las usas. Si algo (de mi biblioteca) no funciona correctamente - hágamelo saber y lo corregiré. Y a hacer preguntas: "¿Por qué funciona así? - necesitas más conocimientos, porque "la obviedad no está en la superficie".

 
TarasBY:

Todavía tienes mucho que aprender. Hasta ahora, sus suposiciones no son ciertas. Mis funciones pueden servir para diferentes propósitos al mismo tiempo (para reducir el código en sí), en particular fGet_MarketInfo(). Todo está pensado repetidamente y no hay que cambiar nada.

Entiendo lo que hay. Pero no está claro por qué se implementa de esta manera.

TarasBY:

Por ejemplo, comience con un experimento: declare una variable global en el cuerpo de la EA e intente llamar a esta variable desde la biblioteca vinculada. Intente vincular los resultados a nombres de variables que tengan un prefijo que empiece por b, por ejemplo bs_Symbol.

De todos modos, no puedes utilizar tus bibliotecas en su forma original, es decir, todo está ligado allí. Cada función en un paquete de otras...

TarasBY:

P.D. No necesito que me revisen: o usas mis bibliotecas, o no las usas. Si algo (alguna biblioteca mía) no funciona correctamente, avísame y lo arreglaré. Y para hacer preguntas: "¿Por qué funciona así? - necesitas más conocimientos, porque "la obviedad no está en la superficie".

No quise probarlo de ninguna manera... De hecho, no hay duda de que está escrito de forma muy competente. Es que no lo entiendo del todo, por eso he dicho que no lo creo... Miro, pienso... Pero no lo entiendo todo. Por eso he preguntado.

P.D. Con bs_Symbol sigo sin entenderlo.