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

 
Konstantin Seredkin:

Eu estava apenas dando um exemplo, existem muitos outros algoritmos que seria bom colocar neste botão, o spread ampliado, o botão foi pressionado, uma mensagem de texto veio ao meu telefone dizendo que o robô está parado ou 4 robôs estão negociando na conta, o 5º controla a margem da conta, quando a margem cai para o valor definido, nós cortamos a auto-negociação e todos os robôs são uma porcaria até que eu chegue e veja o que e onde está entrando em um drawdown.Mas a remoção dos robôs da carta é um canhão contra um coelho... O botão é uma solução complexa que permite matar todos os robôs por um algoritmo pré-determinado.

Eu vi uma solução para mql5 em algum lugar, mas não consigo encontrá-la.

Foi o que eu disse - é uma solução radical. A solução correta é mudar o código do Expert Advisor de modo que, no caso de certas circunstâncias, ele não realizará ações comerciais e tudo o que estiver relacionado com elas. Por exemplo, o controle de propagação é elementar:

void OnTick()
{
    double fPoint = Point();
    if (fPoint <= 0.0)
      return;

    int nSpread = int(MathRound((Ask - Bid) / fPoint));
    if (nSpread > 50)
      return;

   ... Действия советника при нормальном спреде
}
 

Bem, o botão AutoTrade pode ser pressionado/des pressionado ao emular Ctrl+E. Mas, como eu disse, isto é com a ajuda da WinAPI:

#include <WinUser32.mqh>

#define  VK_CONTROL 0x11 
#define  KEY_CODE   'E'


void PressOrReleaseAutotrade()
{
   keybd_event(VK_CONTROL, 0, 0, 0);
   keybd_event(KEY_CODE, 0, 0, 0);
   keybd_event(KEY_CODE, 0, 2, 0);
   keybd_event(VK_CONTROL, 0, 2, 0);   
}
 
Ihor Herasko:

Bem, o botão AutoTrade pode ser pressionado/des pressionado ao emular Ctrl+E. Mas, como eu disse, isto já está usando o WinAPI:

Obrigado! E como você pode fazer uma cara sorridente triste?)

 
Ihor Herasko:

Bem, o botão AutoTrade pode ser pressionado/des pressionado ao emular Ctrl+E. Mas, como eu disse, isto é com a WinAPI:

Exatamente, e eu pensei que era um método dolorosamente simples e esqueci completamente esta biblioteca. Obrigado, agora podemos fazer o que queremos

 

Fez o script MQL4 (código abaixo) que desenha retângulos (foto abaixo), mas aqui está o problema. Para a linha tracejada STYLE_DOT somente a largura 1 funciona, e com 2 ou mais uma linha sólida é traçada. Você pode me dizer onde está meu erro ou há algo que está sendo escondido de nós?

#property strict
void OnStart()
  {
//---
   RectCreate("rect1",Time[1],Low[1],Time[10],High[10],clrYellow,STYLE_DOT,  1,  false);
   RectCreate("rect2",Time[11],Low[11],Time[20],High[20],clrRed, STYLE_DOT,  2,  false);
//---
   Sleep(20*1000);
   ObjectsDeleteAll(0);
  }
//--- Function creates rectangle
void RectCreate(const string           f_name,     // rectangle name
                datetime               f_time1,    // first point time
                double                 f_price1,   // first point price
                datetime               f_time2,    // second point time
                double                 f_price2,   // second point price
                const color            f_color,    // rectangle color
                const ENUM_LINE_STYLE  f_style,    // style of rectangle lines
                const int              f_width,    // width of rectangle lines
                const bool             f_fill)     // filling rectangle with color

  {
   if(ObjectCreate(0,f_name,OBJ_RECTANGLE,0,f_time1,f_price1,f_time2,f_price2))
     {
      ObjectSetInteger(0,f_name,OBJPROP_COLOR,f_color);
      ObjectSetInteger(0,f_name,OBJPROP_STYLE,f_style);
      ObjectSetInteger(0,f_name,OBJPROP_WIDTH,f_width);
      ObjectSetInteger(0,f_name,OBJPROP_FILL,f_fill);
      ObjectSetInteger(0,f_name,OBJPROP_BACK,false);
      ObjectSetInteger(0,f_name,OBJPROP_SELECTABLE,false);
      ObjectSetInteger(0,f_name,OBJPROP_SELECTED,false);
     }
  }

 
Maxim Khrolenko:

Fez o script MQL4 (código abaixo) que desenha retângulos (foto abaixo), mas aqui está o problema. Para a linha tracejada STYLE_DOT somente a largura 1 funciona, e com 2 ou mais uma linha sólida é traçada. Você pode me dizer onde está meu erro ou há algo que está sendo escondido de nós?

E desenhar e mudar manualmente o estilo e a espessura experimentada? E que conclusão se pode tirar dessas experiências?
 
Artyom Trishkin:
Você já tentou desenhar e mudar o estilo e a espessura manualmente? E que conclusão se pode tirar dessas experiências?

Acho que encontrei a resposta. Diz aqui que "estilo de linha". Só é usado quando a espessura da linha é de 0 ou 1". Esta deve ser a razão pela qual linhas de largura 2 e mais não funcionam com linhas que não sejam sólidas.

 
Maxim Khrolenko:

Acho que encontrei a resposta. Diz aqui que "estilo de linha". Somente usado quando a espessura da linha é 0 ou 1". Esta deve ser a razão pela qual linhas que não sejam linhas sólidas não funcionam com uma espessura de 2 ou mais espessas.

Exatamente certo. Eu também já estive lá.

 

Senhores, por favor, avisem, eu assumi uma função de Kim que retorna o número da barra da última posição aberta ou -1.

int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot;
   int      i,k=OrdersTotal();

   if(sym=="") sym=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sym)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL || OrderType()==OP_BUYLIMIT || OrderType()==OP_SELLLIMIT)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime();
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, True));
  }

Eu chamo esta função e escrevo uma condição

if(Open[2]>Close[2] && Open[1]>Close[1] && Close[1]<Low[2])
     {

      Comment("цена входа = ",DoubleToStr(Low[2],Digits));
      if(NumberOfBarOpenLastPos("",0,-1,-1)!=0)//вызвал здесь

         ticket=OrderSend(Symbol(),OP_SELLLIMIT,0.1,Low[2],2,0,0,magic,0);
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

         TP=NormalizeDouble(OrderOpenPrice()-tp*Point,Digits);
      SL=NormalizeDouble(OrderOpenPrice()+sl*Point,Digits);
      modify=OrderModify(ticket,OrderOpenPrice(),SL,TP,0);
      }

Eu olhei através de Print e vi que esta função retorna -1, no início eu pensei que não havia ordem, mas depois de um tempo a ordem reapareceu e no mesmo bar um acordo foi aberto após a parada.

 
Boa tarde. Você sabe se é possível em MT4 e MT5 sobrepor os gráficos de um instrumento com diferentes TFs, bem como indicadores para estas TFs? Por exemplo, quero exibir em uma janela 3 gráficos de par EUR/USD com TFs: dia, 4 horas e hora, e também sobrepor os indicadores deslizantes destes TFs. Isso é possível? Ficarei feliz por qualquer ajuda.
Razão: