Perguntas de Iniciantes MQL4 MT4 MetaTrader 4 - página 128

 
Anatoliy Ryzhakov:

A ordem de venda é encerrada a preço de pedido

Estou um pouco confuso! Aponte o dedo onde o bug está no código!!!(o log diz ORDER CLOSE ERROR 4108) Obrigado de antemão!

 

Boa tarde Connoisseurs! Você já esgotou o dia mais difícil do ano? Podemos começar a trabalhar? ;=).

Eu desenhei um EA, tudo é bom, mas o MQL, como eu entendo, funciona no ambiente MT4. Quero que funcione com um software que funcione diretamente com a troca. Existem outros compiladores MQL? Se não, que linguagem devo usar para reescrever o MQL?

 
STARIJ:

Você tem uma pausa e precisa continuar.

Não tenho uma pausa. Qual é a razão pela qual a EA pode não "ver" suas ordens? Tenho diferentes tempos de servidor e computador, talvez por causa disso?

 
Anatoliy Ryzhakov: Não tenho uma pausa. Qual a razão pela qual a EA não pode "ver" suas ordens? Meu tempo de servidor e meu tempo de computador são diferentes.

O tempo de cada um é diferente. Comece sem se apressar de longe. 1. Verifique o que a função OrdersTotal lhe dá. Seu valor depende das configurações do histórico: Hoje, últimos 3 dias, semana passada, ... Ajuste-o como preferir. 2. Em seguida, crie um ciclo e dê saída a todos os pedidos com Alerta. Isto se chama depuração - é uma parte muito importante do trabalho de um programador. Mais importante do que escrever código.

 
Favor informar como corrigir o erro de quantidade de lotes inválidos para a função FreeMarginCheck na EA, ao definir acidentalmente o valor negativo do volume (lote). Ter uma mensagem sobre o lote errado, sem mensagem de erro, no testador .

 
STARIJ:

O tempo de cada um é diferente. Comece sem se apressar de longe. 1. Verifique o que a função OrdersTotal lhe dá. Seu valor depende das configurações do histórico: Hoje, últimos 3 dias, semana passada, ... Ajuste-o como quiser. 2. Em seguida, crie um ciclo e produza todos os pedidos usando Alert. Isto se chama depuração - é uma parte muito importante do trabalho de um programador. Mais importante do que escrever o código.

Obrigado!

 

Vocês podem me dizer como escrever no código do Expert Advisor para abrir 3 negócios ao mesmo tempo com a capacidade de definir SL?

Esta é minha condição

if(MA_1>MA_2)
ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-SL*Point,Bid+TP*Point,NULL,0,0,clrGreen);
if(MA_1<MA_2)
ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+SL*Point,Ask-TP*Point,NULL,0,0,clrRed);

Fui aconselhado a usar a função (OrderTotal()), mas ela não se encaixa no meu caso. Eu tenho-o assim

void OnTick()
  {
//---
   double MA_1;
   MA_1=iMA(_Symbol,0,1,0,1,0,0);
   double MA_2;
   MA_2=iMA(_Symbol,0,6,0,1,0,0);
   int ticket=0;
   if(OrdersTotal()<=3)
     {
      if(MA_1>MA_2)
         ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-SL*Point,Bid+TP*Point,NULL,0,0,clrGreen);
      if(MA_1<MA_2)
         ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+SL*Point,Ask-TP*Point,NULL,0,0,clrRed);
     }
//---
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

Ela compila bem, sem erros, mas não é apropriada para o meu caso.

Encontrei o seguinte código

#property copyright "Влад Сергеев для mmgp" 
#property version   "1.00" 
#property strict 
#property script_show_inputs 

input int      orders = 4;      //всего ордеров в серии 
input bool     buy = true;      //флаг разрешающий/запрещающий покупки 
input bool     sell = false;    //флаг разрешающий/запрещающий продажи 
input int      magic = 100500;  //уникальный номер для ордеров, открываемых этим скриптом 
input double   lot = 0.01;      //объем каждого ордера серии 
input int      tp = 100;        //тейк профит, в пунктах 
input int      sl = 100;        //стоп лосс, в пунктах 
input int      slip = 2;        //допустимое проскальзывание на открытии, в пунктах (для ECN, где открытие по рынку - игнор) 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   int i=0;  // для чего эта переменная
   int ticket=0;
   if(buy) 
     {
      while(i<orders) // здесь эта переменная используется чтобы сравнивать ордера или для чего
        {
         RefreshRates(); // если убрать эту функцию коду хуже не становится
         ticket=OrderSend(Symbol(),OP_BUY,lot,NormalizeDouble(Ask,Digits),slip,0,0,"",magic,0,clrBlue); //здесь понятно
         if(ticket!=-1) // эта строчка тоже не понятна
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))  // функция для выбора ордера это логично но тоже не понятно как ей пользоваться
              {
               OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-sl*Point,Digits),NormalizeDouble(OrderOpenPrice()+tp*Point,Digits),0,clrBlue);
               // эту строчку тоже хотел бы чтобы объяснили
              }
           }
         i++; // что увеличивается на оду единицу это относится к магическому номеру ордера чтобы программа понимала что у неё есть ордера
        }
     }
   i=0;
   if(sell) // прошлая запись была для покупак эта для продаж 
     {
      while(i<orders) 
        {
         RefreshRates();
         ticket=OrderSend(Symbol(),OP_SELL,lot,NormalizeDouble(Bid,Digits),slip,0,0,"",magic,0,clrRed);
         if(ticket!=-1) 
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))  
              {
               OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+sl*Point,Digits),NormalizeDouble(OrderOpenPrice()-tp*Point,Digits),0,clrRed);
              }
           }
         i++;
        }
     }
  }  
//+------------------------------------------------------------------+

Talvez possa ser usado, mas não entendo o significado das cordas. Este código pode ser usado quando reescrito para se adequar à minha condição?

 
Seric29:

Vocês podem me dizer como escrever no código do Expert Advisor para abrir 3 negócios ao mesmo tempo com a capacidade de definir SL?

Esta é minha condição

Fui aconselhado a usar a função (OrderTotal()), mas ela não se encaixa no meu caso. Eu tenho-o assim

Ela compila bem, sem erros, mas não é apropriada para o meu caso.

Encontrei o seguinte código

Talvez possa ser usado, mas não entendo o significado das cordas. Posso usar este código se eu o reescrever para se adequar à minha condição?

Tente desta forma

pos=0; // contador de pedidos

for(int i=OrdensTotal()-1;i>=0;i--) //ler ordens de mercado

{

se (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continuar;//selecione das ordens de mercado

{

se (OrderSymbol()!=Symbol()&&OrderMagicNumber()!=Magic) continuar;//selecione apenas ordens EA (se houver Magic e ele for negociado em qualquer par de moedas)

pos++; // se selecionado, aumentar pos em um

}

}

 if(MA_1>MA_2&&pos<3)
 OrderSend(_Symbol(),OP_BUY,Lots,Ask,0,Ask-SL*Point,Ask+TP*Point,NULL,Magic,0,clrGreen);
 if(MA_1<MA_2&&pos<3)
 OrderSend(_Symbol(),OP_SELL,Lots,Bid,0,Bid+SL*Point,Bid-TP*Point,NULL,Magic,0,clrRed);

 
Um fórum bastante interessante. Muito material esclarecedor!)
 
Seric29:

Vocês podem me dizer como escrever no código da EA para abrir 3 negócios de uma só vez com a capacidade de definir SL?

if(MA_1>MA_2)
     for(int i=0; i<3; i++)
          tiket = OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-(i==0?SL_1:i==1?SL_2:SL_3)*Point,Bid+TP*Point,NULL,0,0,clrGreen);
if(MA_1<MA_2)
     for(int i=0; i<3; i++)
          tiket = OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+(i==0?SL_1:i==1?SL_2:SL_3)*Point,Ask-TP*Point,NULL,0,0,clrRed);