[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 270

 
hoz:


Eu não quis dizer que o parâmetrofi_Ticket não é necessário, mas por que ele foi ajustado para 0 (zero) por padrão. Eu o faria dessa maneira:

Vou duplicar o código fonte novamente:

Esta função permite obter informações comerciais por um instrumento (sem vinculação a uma ordem, por exemplo, antes de abrir uma ordem) e a mesma, mas em conjunto com uma ordem específica (quando é seguida por uma ordem). O valor padrão é usado para facilitar o uso da função. O valor negativo do fi_Ticket é usado ao inicializar a biblioteca comercial.

P.S. E primeiro, preste atenção aos nomes das variáveis, ou mais precisamente aos seus prefixos. As variáveis que têm um b inicial, como bs_Symbol, são declaradas globalmente da biblioteca. A maioria das variáveis globais são declaradas no b-PSI@Base.

 

Por favor, olhe para o código EA, não consegue descobrir qual é a razão.... No início ela pode abrir uma negociação imediatamente, mas depois de fechar ela deixa de funcionar até o próximo reinício do terminal ou ligar/desligar permitir que a EA negoceie... Funciona com o 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:
Aqui está um exemplo da documentação de um comando que o ajudará - descobrir como ele funciona, mudar os parâmetros:

Alto[iHighest(NULL,0,MODE_HIGH,20,4)];
Baixo[iLowest(NULL,0,MODE_LOW,10,10)];


OBRIGADO
 
chief2000:
Aqui está um exemplo da documentação de um comando que o ajudará - descobrir como ele funciona, mudar os parâmetros:

Alto[iHighest(NULL,0,MODE_HIGH,20,4)];
Baixo[iLowest(NULL,0,MODE_LOW,10,10)];


Desculpe o atraso com minha resposta, tenho tido problemas com meu computador.
 
chief2000:
Aqui está um exemplo da documentação de um comando que o ajudará - descobrir como ele funciona, mudar os parâmetros:

Alto[iHighest(NULL,0,MODE_HIGH,20,4)];
Baixo[iLowest(NULL,0,MODE_LOW,10,10)];


Desculpe o atraso com minha resposta, tenho tido problemas com meu computador.
 
al7bar:

Por favor, olhe para o código EA, não consegue descobrir qual é a razão.... No início ela pode abrir uma negociação imediatamente, mas depois de fechar ela deixa de funcionar até o próximo reinício do terminal ou ligar/desligar permitir que a EA negoceie... Funciona com o indicador Gann 2.0

Não foram vistos erros lógicos óbvios. Por favor, imprima o código passo a passo. O procedimento de negociação está vinculado ao valor da variável ticket. Antes de mais nada, rastrear suas mudanças. Preste também atenção ao valor da variável global "TRADECONTEXT" - seu valor deve ser 0.
 
TarasBY:

Esta função permite obter informações comerciais para um instrumento (sem ligá-lo a uma ordem, por exemplo, antes de abrir uma ordem) e a mesma, mas em conjunto com uma ordem específica (quando a acompanha). O valor padrão é usado para facilitar o uso da função. O valor negativo do fi_Ticket é usado ao inicializar a biblioteca comercial.

P.S. E primeiro, preste atenção aos nomes das variáveis, ou mais precisamente aos seus prefixos. As variáveis que têm um b inicial, como bs_Symbol, são declaradas globalmente da biblioteca. A maioria das variáveis globais são declaradas no b-PSI@Base.


Igor, eu entendo isso. Mas a questão é, como eu entendo, para obter informações de mercado para um determinado símbolo, não precisamos vinculá-lo de forma alguma a uma ordem. Se houver um instrumento, não é necessário um pedido... Não é necessário de forma alguma. Afinal de contas, você só precisa do nome do instrumento para obter informações do mercado. Você não concorda?

Esta variável que eu estava perguntando sobrebs_Symbol é mencionada pela primeira vez na inclusão do b-PSY@Base.mqh, aqui está a string:

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

Mas, nada é atribuído a ela. Então:

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

Há uma expressão:

fs_Symbol != bs_Symbol

Deve ser entendido como:fs_Symbol != 0 certo?

TarasBY:

P.S. E primeiro, preste atenção aos nomes das variáveis, ou mais precisamente, seus prefixos. As variáveis que têm um b inicial, como bs_Symbol, são declaradas globalmente da biblioteca. A maioria das variáveis globais são declaradas no b-PSI@Base.


Hm. Eu normalmente uso g_ para denotar variáveis globais (da palavra global). Você usa l(por exemplo, li_cnt) para significar variáveis locais?
 

Amigos! Preciso de ajuda no ajuste de um EA.

Há algum código que abre uma ordem sob certas condições. A execução da condição pode ocorrer a cada tique porque é colocada no corpo do int start().

Nós precisamos:

1. Após a execução de uma condição (e abertura de uma ordem), devemos fazer uma pausa para a abertura de novas ordens, pausa para n barras. Por exemplo, se meu consultor especializado estiver no prazo M30 e eu precisar passar 3 horas, então a pausa deve ser de 6 barras.

2. O programa deve funcionar no testador de estratégia.

Que código é necessário? E onde seria o lugar certo para inseri-lo.

int start()
  { 
   ...

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

   ...
  }
 
hoz:


Igor, eu entendo isso. Mas a questão é, como eu entendo, para obter informações de mercado sobre um determinado instrumento, você não precisa vinculá-lo a uma ordem. Se houver um instrumento, não é necessário um pedido... Não é necessário de forma alguma. Afinal de contas, você só precisa do nome do instrumento para obter informações do mercado. Você não concorda?

Esta variável que eu estava perguntando sobrebs_Symbol é mencionada pela primeira vez na inclusão do b-PSY@Base.mqh, aqui está a string:

Mas, nada é atribuído a ela. Então:

Há uma expressão:

Deve ser entendido como:fs_Symbol != 0 certo?


Hm. Eu normalmente uso g_ para denotar variáveis globais (da palavra global) e l(por exemplo, li_cnt) para significar local?

Você ainda tem muito a aprender. Até agora, suas suposições não são verdadeiras. Minhas funções podem servir a diferentes propósitos ao mesmo tempo (a fim de reduzir o próprio código), em particular fGet_MarketInfo(). Tudo é pensado repetidamente e nada precisa ser mudado!

Comece, por exemplo, com uma experiência: declare uma variável global no corpo da EA e tente chamar esta variável a partir da biblioteca vinculada. Tente ligar os resultados a nomes de variáveis que tenham um prefixo começando com b, por exemplo, bs_Symbol.

P.S. Não preciso ser verificado: ou você usa minhas bibliotecas, ou não usa. Se alguma coisa (parte da minha biblioteca) não funcionar corretamente - me avise e eu corrigirei. E para fazer perguntas - "Por que funciona dessa maneira? - você precisa de mais conhecimento, porque "a evidência não está na superfície".

 
TarasBY:

Você ainda tem muito a aprender. Até agora, suas suposições não são verdadeiras. Minhas funções podem servir a diferentes propósitos ao mesmo tempo (a fim de reduzir o próprio código), em particular fGet_MarketInfo(). Tudo é pensado repetidamente e nada precisa ser mudado!

Eu entendo o que está lá. Mas não está claro por que é implementado desta forma.

TarasBY:

Por exemplo, comece com uma experiência: declare uma variável global no corpo da EA e tente chamar esta variável a partir da biblioteca vinculada. Tente ligar os resultados a nomes de variáveis que tenham um prefixo começando com b, por exemplo, bs_Symbol.

Você não poderá usar suas bibliotecas em sua forma original de qualquer forma, ou seja, tudo está vinculado a elas. Cada função em um pacote de outras...

TarasBY:

P.S. Não preciso ser verificado: ou você usa minhas bibliotecas, ou não usa. Se alguma coisa (alguma biblioteca minha) não estiver funcionando corretamente - me avise e eu consertarei isso. E para fazer perguntas - "Por que funciona dessa maneira? - você precisa de mais conhecimento, porque "a obviedade não se encontra na superfície".

Eu não queria testar de forma alguma... Na verdade, não há dúvida de que está escrito de forma muito competente. É que eu não entendo bem tudo, é por isso que eu disse que não penso assim... Eu olho, eu acho... Mas eu não entendo tudo. Foi por isso que eu perguntei.

P.S. Com bs_Symbol eu ainda não entendi.

Razão: