Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 482

 

@STARIJ Obrigado, demorei meu tempo escrevendoObjectSet! Há muito tempo foi escrito, não comentado, e o código não interfere! Você escreveuStringSubstr(str,20,7) , eu não pensei que fosse tudo literal! Depois do jantar, percebi que era tudo sobre os espaços! Eu deveria ter contado cada personagem e cada espaço! Obrigado amigo!!!!


 

Olá, queridos amigos. Outra pergunta de um novato de μl4. Eu uso a função Fun_New_Bar() recomendada no tutorial para definir uma nova barra:


void Fun_New_Bar()                              // Ф-ия обнаружения нового бара   
  {                                             
   static datetime New_Time=0;                  // Время текущего бара  
   New_Bar=false;                               // Нового бара нет  
   if(New_Time!=Time[0])                        // Сравниваем время  
     {  
      New_Time=Time[0];                         // Теперь время такое  
      New_Bar=true;                             // Поймался новый бар  
     }  
  }
No entanto, por alguma razão, nem sempre funciona. Coloquei um cheque impresso:
if(Hour()>=8 && Hour()<20) 
      {
      Fun_New_Bar();
      if(New_Bar==false) Print("Нового бара нет");
      if(New_Bar==true )      
       {     
       RefreshRates();
        ........... Fun_Open_Sell();          
        ........... Fun_Open_Buy();
       } 
      }

Assim, abre uma posição em um novo bar, depois imprime "Sem novo bar" e abre uma posição no bar atual. Não consigo entender por que. Obrigado.

 
novichok2018:

Olá, queridos amigos. Outra pergunta de um novato de μl4. Eu uso a função Fun_New_Bar() recomendada no tutorial para definir uma nova barra:

No entanto, de alguma forma nem sempre funciona. Coloquei um cheque impresso:

Assim, abre uma posição em um novo bar, depois imprime "Sem novo bar" e abre uma posição no bar atual. Não consigo entender por que. Obrigado.

Como você faz distinção entre Bar Novo e Bar atual? Com que freqüência esta parte do código é executada - cada carrapato ou somente quando uma nova barra é formada?

 
STARIJ:

como distinguir entre Bar Novo e Bar atual? Com que freqüência esta parte do código é executada - cada carrapato ou somente quando uma nova barra é formada?

Nova barra - por função. A barra atual - na qual uma posição foi fechada, mas o tempo da barra não expirou. O código deve ser executado no momento da formação de umanova barra. Ou melhor, não é assim. A parte do código onde são definidas as condições para o fechamento da posição é executada a cada tick, enquanto as condições para a abertura da posição são executadas em uma nova barra.

 
novichok2018:

Nova barra - por função. Atual - onde a posição foi fechada, mas o tempo de bar não expirou. O código deve ser executado no momento em que anova barra é formada.Ou melhor, não é. A parte do código onde são definidas as condições para o fechamento da posição é executada a cada tick, enquanto a condição para a abertura da posição é executada em uma nova barra.

Portanto, tudo está claro aqui. Mas quando estiver escrevendo e ver que deve escrever com mais precisão, mova o cursor para trás e corrija. Caso contrário, é difícil lê-lo desta e daquela maneira.

O código é executado a cada tique. Isto é, a pergunta "Existe um novo bar? Existe um novo bar? Existe um novo bar? e cada vez que é impressa uma mensagem de que não existe um novo bar. E depois há um novo bar. O pedido abre? Primeiro é enviado um comando para o servidor. E depois chegam os carrapatos e há um novo bar? Há um novo bar e toda vez que não há um novo bar, o servidor finalmente abre um pedido e você olha para a hora e se pergunta que horas são. Você pode usar Print(TimeCurrent()) antes da abertura de um pedido, 4 linhas abaixo da primeira. Ou melhor ainda, use Alerta - diretamente na tela. Você pode ver num relance.

Mais uma coisa: ao invés de if(New_Bar==false) if(New_Bar===true), você pode usar if(!New_Bar) if(New_Bar) caso contrário você recebe óleo amanteigado

 
STARIJ:

Em resumo, tudo está claro aqui. Mas quando você escreve e vê que precisa escrever com mais precisão, traga o cursor de volta e o corrija. É difícil lê-lo desta e daquela maneira.

O código é executado a cada tique. Isto é, a pergunta "Existe um novo bar? Existe um novo bar? Existe um novo bar? e cada vez que é impressa uma mensagem de que não existe um novo bar. E depois há um novo bar. O pedido abre? Primeiro é enviado um comando para o servidor. E depois chegam os carrapatos e há um novo bar? Há um novo bar e toda vez que não há um novo bar, o servidor finalmente abre um pedido e você olha para a hora e se pergunta que horas são. Você pode usar Print(TimeCurrent()) antes da abertura de um pedido, 4 linhas abaixo da primeira. Ou melhor ainda, use Alerta - diretamente na tela. Você pode ver num relance.

E mais uma coisa: em vez de if(New_Bar==false) if(New_Bar===verdadeiro) você pode usar if(!New_Bar) if(New_Bar) se(New_Bar) caso contrário você receberá óleo

Ok, tudo está claro com a mensagem sobre a ausência de um novo bar. O tempo de abertura do pedido exibido na revista pela plataforma é bastante suficiente para mim, mesmo sem uma impressão adicional. Entretanto, ainda não entendo porque uma ordem é aberta em um novo bar uma vez e no atual uma segunda vez, embora de acordo com o código, um novo bar deve aparecer antes de procurar condições para abrir a posição.

 
novichok2018:

OK, tudo está claro com a mensagem sobre a ausência de um novo bar. O tempo de abertura do pedido impresso no registro pela plataforma é suficiente para mim, mesmo sem a impressão adicional. Entretanto, ainda não entendo porque o pedido abre em uma nova barra uma vez e na atual uma segunda vez, embora de acordo com o código, uma nova barra deva aparecer antes de procurar condições para abrir a posição.

Primeiro, um comando é enviado para o servidor. Enquanto isso, os carrapatos vêm e há um novo bar? Há um novo bar e cada vez que não há um novo bar, o servidor finalmente abre um pedido e você olha para a hora e se pergunta. Você pode usar Print(TimeCurrent( )) antes da abertura de um pedido, 4 linhas abaixo da primeira. Ou melhor ainda, use Alerta - direto para a tela. Você pode ver num relance... o comando para abrir o pedido foi enviado mais cedo, no novo bar

 

Você pode me dizer como tornar possível ter uma cor de sombra entre as 2 linhas indicadoras?

Como em ishimoku

 
Roman Sharanov:

Você pode me dizer como tornar possível ter uma cor de sombra entre as 2 linhas do indicador? Como no ishimoku

uma olhada em como se faz... E o terminal provavelmente tem...

 

Olá, comecei a estudar a MQL4 usando os tutoriais em vídeo de 2013, tenho reescrito o código exatamente do vídeo, acrescentando algumas pequenas mudanças de outro, pois preciso delas. Como resultado, recebo 25 erros. Tentei buscar uma solução para estes erros, mas desde que a construção do terminal mudou e algumas mudanças na codificação ocorreram. Serei grato se alguém puder me ajudar a editar o código ou pelo menos me dar alguns conselhos úteis, obrigado antecipadamente.

//+------------------------------------------------------------------+
//|                                                           ea.mq4 |
//|                                                             mql4 |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Intruder"
#property link      ""
#property version   "1.00"
#property strict

extern double Lots         = 0.1;
extern int    TakeProfit   = 50;
extern int    Step         = 50;
extern double Multiplier   = 2;
extern int    Slippage     = 5;
extern int    Magic        = 123;

extern int    MA_1_Period  = 21;
extern int    MA_1_Shift   = 0;

extern int    MA_2_Period  = 3;
extern int    MA_2_Shift   = 0;


int ticket;
double price, TP, lastlot;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int Init()
{
   if (Digits == 3 || Digits == 5)
   {
       TakeProfit *= 10;
       Step       *= 10;
       Slippage   *= 10;  
   }
   return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert start function                                             |
//+------------------------------------------------------------------+
int start()
{
   if (CountTrades() == 0)
   {
      double ima_1 = iMA(Symbol(), PERIOD_CURRENT, MA_1_Period, MA_1_Shift, MODE_SMA, PRICE_CLOSE, 1);
      double ima_2 = iMA(Symbol(), PERIOD_CURRENT, MA_2_Period, MA_2_Shift, MODE_SMA, PRICE_CLOSE, 1);
      
      if (ima_1 > ima_2)
      {
         ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "", Magic, 0, Blue);
         if(ticket > 0)
         {
            TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
            OrderModify(ticket, OrderOpenPrice(), 0, TP, 0);
         }
      }
      else if(ima_1 < ima_2)
      {
         ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", Magic, 0, Red);
         if(ticket > 0)
         {
            TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);
            OrderModify(ticket, OrderOpenPrice(), 0, TP, 0);
         }
      }
      
   }
   else
   {
      int order_type = FindLastType();
      if (order_type == OP_BUY)
      {
         price = FindLastOrderPrice(OP_BUY);
         if(Ask <= price - Step * Point)
         {
            Lastlot = FindLastLots (OP_BUY);
            lastlot = NormalizeDouble(lastlot * Multiplier, 2);
            ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask, Slippage, 0, 0, "", Magic, 0, Blue);
            if (ticket > 0)
               ModifiOrders(OP_BUY);
         }
      }
      else if (order_type == OP_SELL)
      {
          price = FindLastOrderPrice(OP_SELL);
         if(Bid <= price + Step * Point)
         {
            Lastlot = FindLastLots (OP_SELL);
            lastlot = NormalizeDouble(lastlot * Multiplier, 2);
            ticket = OrderSend(Symbol(), OP_BUY, lastlot, Bid, Slippage, 0, 0, "", Magic, 0, Red);
            if (ticket > 0)
               ModifiOrders(OP_SELL);
         }        
      }
   }
   
   return(0);
}
//+------------------------------------------------------------------+
void ModifiOrders(int otype)
{
   double avgprice = 0,
          order_lots= 0;
   
   price = 0;
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelecti(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
         {
            price += OrderOpenPrice() * OrderLots();
            order_lots += OrderLots();
         }
      }
   }
   avgprice = NormalizeDouble(price / order_lots, Digits);
   
   if (otype == OP_BUY) TP = NormalizeDouble(avgprice + TakeProfit*Point, Digits);
   if (otype == OP_SELL) TP = NormalizeDouble(avgprice - TakeProfit*Point, Digits);
   
   for (i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
            OrderModify(OrderTicket(), OrderOpenPrice(), 0, TP, 0)    
      } 
   }
}
//+------------------------------------------------------------------+
double FindLastLots(int otype)
{
   double oldlots;
   int oldticket;
   
   ticket = 0;
   for(int i = OrdersTotal ()-1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() ++ otype)
         {
            oldticket = OrderTicket();
            if(oldticket > ticket)
            {
               oldlots = OrderLots();
               ticket = oldticket;
            }
         }
      }
   }
   return(oldlots);
}
//+------------------------------------------------------------------+
double FindLastOrderPrice(int otype)
{
   double oldopenprice;
   int    oldticket;
   
   ticket = 0;
   
   for(int i=OrdersTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype
         {
            oldticket = OrderTicket();
            if(oldticket > ticket)
            {
               oldopenprice = OrderOpenPrice();
               ticket = oldticket;
            }
         }
      }
   }
   return(oldopenprice);
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
   for (int i= OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber () == Magic)
              return(OrderType());
      }
   }
   return(-1);   
}
//+------------------------------------------------------------------+
int CountTrades()
{
   int count = 0;
   for (int i=OrdersTotal()-1 i>=0; i--)
   {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               count++;
        }
   }
   
   return(count);

//-------------------------------------------------------------------+

Erros

Razão: