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

 

O que é o Factor de Diminuição no assessor MT padrão sobre mashcats?

lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
 
Nerd Trader #:

É estranho, os botões estão lá agora. E a confusão do código, porque é um rascunho. De qualquer forma, eu já fiz uma versão funcional, a última coisa que resta é apagar os botões, aqui novamente esta foda começou: a função de apagar não encontra nenhum dos 4 objetos.

Clicando no botão, todas as linhas são criadas:

Se o botão for pressionado - apagar:

Que monte de porcaria está escrito, desculpe-me.

 
Artyom Trishkin #:

E você não precisa assistir aos eventos. Eles não trabalham de forma alguma no testador. Você tem que observar o status.

UPD. Não modesto, é claro, mas se você tivesse ouvido minhas dicas por uma vez, já teria feito tudo há muito tempo. De forma adequada e sem as muletas de um armazém com vários andares.

Mas todos escolhem o abismo em que querem mergulhar.

Mihail Matkovskij #:

Para usar o depurador no testador, aprenda a escrever em MQL5. Tudo funciona lá.

Não existe tal coisa como renomear um objeto. Pense nisso como a substituição de um objeto existente por um novo.

Isto não pode ser. Seu código parece uma confusão de coisas. É provavelmente por isso que você está tendo um atraso com os botões. Como já lhe disse antes, comece com algo simples. Não complique em demasia as coisas. E gradualmente complica quando o simples começa a funcionar e você está confiante nisso.

E como eu vejo os estados se eles são acionados por evento (por clique)? Sim, mas estou escrevendo em mql4, é o mesmo que dizer "aprenda a escrever em c# onde funciona o debug".

"Correto e sem muletas de vários andares". " - portanto, esconder objetos é apenas muletas.

Em tudo o que fiz, tudo funciona
Ao clicar no botão todas as linhas são criadas de uma só vez, depois são escondidas e apenas uma é deixada dependendo da localização do painel de botões. Outras linhas são escondidas/mostradas, dependendo da localização do cursor em relação ao preço.

P.S.

Se não fosse pelo mql4 torto, eu não teria que inventar esse absurdo de esconder objetos, tudo deveria ter funcionado da primeira vez com a eliminação/renomeação de objetos.

stop order button (public).mq4
stop order button (public).mq4
  • gist.github.com
GitHub Gist: instantly share code, notes, and snippets.
 
Nerd Trader #:

E como eu vejo os estados se eles são acionados por evento (por clique)? Sim, mas eu escrevo em mql4, é o mesmo que dizer "aprenda a escrever em c# onde funciona o debug".

"Correto e sem muletas de vários andares". "Então, esconder objetos é apenas muletas".

Em tudo o que fiz, tudo funciona
Ao clicar no botão todas as linhas são criadas de uma só vez, depois são escondidas e somente uma é deixada dependendo da localização do painel de botões. Outras linhas são escondidas/mostradas, dependendo da localização do cursor em relação ao preço.

P.S.

Se não fosse pelo mql4 torto, eu não teria que inventar este absurdo sobre esconder objetos, tudo deveria ter funcionado da primeira vez com a eliminação/renomeação de objetos também.

Esconder um objeto é apenas o método recomendado pelo desenvolvedor. E há uma propriedade especial para isso. Para ver o estado, você precisa olhar para a propriedade "Estado" do botão.

O que está torto aqui é sua lógica e substituição de noções - você toma os meios recomendados pelo desenvolvedor como uma muleta, e toma a constante criação/eliminação de objetos vorazes como puro código, mas é exatamente isso que é uma muleta, contornando o método rápido recomendado.

A propósito, para tornar rapidamente um objeto em cima de todos os outros, é preciso torná-lo invisível, e imediatamente visível - isto redefinirá sua posição na lista de objetos, e ele estará no topo.

ZS. E mesmo ali, no git, você publicou o código com um C menos. Totalmente propenso a erros. Apenas uma linha não é criada e tudo desmorona. Isso foi imediatamente aparente. Você cria linhas no event handler - para quê? Para que você precisa do OnInit()? Você a criou, verificou seu sucesso, colocou uma bandeira e a escondeu. No OnDeinit() você eliminou objetos criados por seu programa. Você também precisa do prefixo do nome para isso.

Você só mostra e se esconde no manipulador de eventos - não deve haver nenhum prédio. Para o seu caso - exatamente.

Eu teria vergonha de publicar tal coisa em domínio público no git. Mas isso é para mim.

E você? As pessoas podem tirar proveito disso?

 
Artyom Trishkin #:

Esconder um objeto é exatamente o método recomendado pelo desenvolvedor. E há uma propriedade especial para isso. Para ver o estado, você precisa olhar para a propriedade "Estado" do botão.

O que está torto aqui é sua lógica e substituição de noções - você toma os meios recomendados pelo desenvolvedor como uma muleta, e toma a constante criação/eliminação de objetos vorazes como código puro, mas é exatamente isso que é uma muleta para contornar o método rápido recomendado.

A propósito, para tornar rapidamente um objeto em cima de todos os outros, é preciso torná-lo invisível, e imediatamente visível - isto redefinirá sua posição na lista de objetos, e ele estará no topo.

ZS. E mesmo ali, no git, você publicou o código com um C menos. Totalmente propenso a erros. Uma vez que uma linha não é criada, sua coisa toda desmorona. Isso foi imediatamente aparente. Você cria linhas no event handler - para quê? Para que você precisa do OnInit()? Você a cria, verifica seu sucesso, coloca uma bandeira e a esconde. No OnDeinit() você eliminou objetos criados por seu programa. Você também precisa do prefixo do nome para isso.

Você só mostra e se esconde no manipulador de eventos - não deve haver nenhum prédio. Para o seu caso - exatamente.

Eu teria vergonha de publicar tal coisa em domínio público no git. Mas isso é para mim.

E você? As pessoas podem tirar proveito disso?

voraz para criar 1 linha de 4, conforme a necessidade? :) E se houver 200 linhas? Será econômico criá-los todos de uma vez, de acordo com sua lógica? E como ela foi concebida pelos desenvolvedores é conhecida apenas por eles, e concebida de uma forma muito não-intuitiva. Como se nada de incrível ou ilógico fosse necessário. Como eu poderia saber que deveria trabalhar com objetos somente desta maneira e não de qualquer outra maneira? Talvez de um livro didático em mql4? Duvido que este ponto seja explicado ali.

Ao menos, funciona como foi pretendido :) Está entre parênteses no título (público), portanto ainda não está completo, mas sim, não há verificação para criar objetos, vamos corrigi-lo. E eu a afixei somente porque não conseguia me lembrar do caixote do lixo de pasta. Envergonhado? O Git foi criado para que as pessoas aprendam, troquem experiências, compartilhem códigos, trabalhem ou não, não faz diferença, qualquer um pode fazer um garfo e fazer mudanças se não estiver satisfeito com algo.

Aqui você está, 250 objetos foram criados e armazenados na memória durante a vigência do Expert Advisor. Bem, obrigado, eu saberei. Isto é o que quero dizer com "lógica não-intuitiva". Por exemplo, no tutorial sobre o OnInit(), você pode ler apenas que a função é processada durante a inicialização do Expert Advisor/indicador.

 
Nerd Trader #:


Deixe-me contar-lhe um segredo. Você pode criar até 1.000 objetos ou mais, desde que não tenha uma 'calculadora'. Mas ele também pode fazer isso. Uma calculadora é um computador com 4GB de RAM. Qualquer coisa abaixo que seja "calculadora da avó"... :) Assim você pode criar objetos todos de uma só vez ou um de cada vez. Isso não faz diferença. Mas sem fanatismo.

Dessa forma, tudo funciona para todos se você o fizer com sabedoria!

 
Nerd Trader #:

Voraciência para criar 1 linha de 4, conforme necessário? :) E se houver 200 linhas? Seria econômico criá-los todos de uma só vez, de acordo com sua lógica? E como ela foi concebida pelos desenvolvedores é conhecida apenas por eles, e concebida de uma forma muito não-intuitiva. Como se nada de incrível ou ilógico fosse necessário. Como eu poderia saber que deveria trabalhar com objetos somente desta maneira e não de qualquer outra maneira? Talvez de um livro didático em mql4? Duvido que este ponto seja explicado ali.

Ao menos, funciona como foi pretendido :) Está entre parênteses no título (público), portanto ainda não está completo, mas sim, não há verificação para criar objetos, vamos corrigi-lo. E eu a afixei somente porque não conseguia me lembrar do caixote do lixo de pasta. Envergonhado? O Git foi criado para que as pessoas aprendam, troquem experiências, compartilhem códigos, trabalhem ou não, não faz diferença, qualquer um pode fazer um garfo e fazer mudanças se não estiver satisfeito com algo.

Aqui você está, 250 objetos foram criados e armazenados na memória durante a vigência do Expert Advisor. Muitobem, obrigado, eu saberei. Isto é o que quero dizer com "lógica não intuitiva". Você pode ler no tutorial, por exemplo, sobre o OnInit(), que a função é processada durante a inicialização de um EA/indicador.

Você pode criar tantos objetos quantos forem necessários ao mesmo tempo. Na época em que a MT não estava muito desenvolvida em termos de desenho de castiçais indicadores, tivemos que desenhar 400 castiçais visíveis com linhas de tendência, para um castiçal precisamos de 5 linhas, 400*5=2000, mais um objeto para cada um e assim por diante. Ao todo, temos cerca de 2500 objetos. Funcionou sem nenhuma estupidez.

Você não entende bem a lógica de trabalhar com objetos, mas sabe como argumentar. É melhor fazer o contrário.

 
Nerd Trader #:

Voraciência para criar 1 linha de 4, conforme necessário? :) E se houver 200 linhas? Seria econômico criá-los todos de uma só vez, de acordo com sua lógica? E como ela foi concebida pelos desenvolvedores é conhecida apenas por eles, e concebida de uma forma muito não-intuitiva. Como se nada de incrível ou ilógico fosse necessário. Como eu poderia saber que deveria trabalhar com objetos somente desta maneira e não de qualquer outra maneira? Talvez de um livro didático em mql4? Duvido que este ponto seja explicado ali.

Ao menos, funciona como foi pretendido :) Está entre parênteses no título (público), portanto ainda não está completo, mas sim, não há verificação para criar objetos, vamos corrigi-lo. E eu a afixei somente porque não conseguia me lembrar do caixote do lixo de pasta. Envergonhado? O Git foi criado para que as pessoas aprendam, troquem experiências, compartilhem códigos, trabalhem ou não, não faz diferença, qualquer um pode fazer um garfo e fazer mudanças se não estiver satisfeito com algo.

Aqui você está, 250 objetos foram criados e armazenados na memória durante a vigência do Expert Advisor. Muitobem, obrigado, eu saberei. Isto é o que quero dizer com "lógica não intuitiva". A única coisa que você pode ler no tutorial, por exemplo, sobre o OnInit(), é que a função é processada durante a inicialização do Expert Advisor/indicador.

Bem-vindo. Vou tentar explicar isso em russo simples.

Você vai fazer uma viagem de pesca.

  1. Em casa você abre a despensa, arranha a cabeça e a fecha.
  2. Você vai pescar e precisa de uma cana de pesca.
  3. Você vai para casa, no armazém, para pegar uma cana de pesca.
  4. Foi pescar, colocou sua cana de pesca e pescou um peixe, e você precisa de uma rede
  5. Voltou para o depósito para a rede
  6. Foi pescar, pegou o peixe que você pescou e flutuou no anzol com a rede, e você precisava de um recipiente para armazenar o peixe que você havia pescado
  7. Volte para casa para ..... Devo continuar?

Ou você pode levar tudo o que precisa da despensa (OnInit) imediatamente, pescar sem correr e, quando chegar em casa, colocar tudo na despensa e no refrigerador (OnDeinit).

Você deve ter sabido disso aqui no fórum. Você só precisa ouvir e ouvir o que lhe é dito às vezes.

Caso contrário, você recebe uma pergunta, recebe uma resposta, diz "besteira" e faz o que você pensa.

Você deve primeiro pensar sobre a pergunta, fazer perguntas e depois começar a editar.

Você sabe que a coisa mais simples na programação é imprimir código? E a maior parte do desenvolvimento é pensar na lógica.

 

Sinto muito em trazer isto à tona uma segunda vez.

Mas há um problema que eu ainda não posso resolver, a saber

abrindo uma série de pedidos (um após o outro) no mesmo castiçal.

Preciso impedir que a EA abra um novo pedido no mesmo castiçal.

Pensei em resolvê-lo usando o Sleep(), mas Makar disse que seria melhor não parar o processo.

problema.

O código agora é parecido com este:

// Параметры советника
input string  sParametersEA = "";     // Параметры советника
input double  Lot           = 0.01;   // Количество лотов
input int     StopLoss      = 30;     // Уровень убытка
input int     TakeProfit    = 30;     // Уровень прибыли
input int     Slippage      = 3;      // Проскальзование (в пунктах)
input int     Magic         = 1;      // Индентификатор советника
input double  K_Martin1     = 2.0;    // Множитель мартин 1
input double  K_Martin2     = 2.0;    // Множитель мартин 2
input double  K_Martin3     = 2.0;    // Множитель мартин 3
input int     OrdersClose   = 5;      // Ограничение лотности мартин1
input int     OrdersClose2  = 5;      // Ограничение лотности мартин2
input int     DigitsLot     = 2;      // Точность лотности
// Параметры индикатора
input string  sParametersMA = "";     // Параметры индикатора
input int     PeriodMA      = 14;     // Период мувинга
input int     MovingShift   = 1;      // Сдвиг мувинга
// Глобальные переменные
string AC;
datetime Start;
double dMA;
double MaxMartinLot;
double MaxMartinLot2;
//+-----------------------------------------------------------------------------------------------+
int OnInit()
  {
Start          = TimeCurrent();
MaxMartinLot   = Lot*MathPow(1.4,OrdersClose);
MaxMartinLot2  = Lot*MathPow(K_Martin2,OrdersClose2);
AC             = StringConcatenate(" ", AccountCurrency());
return(INIT_SUCCEEDED);
  }
//+-----------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+-----------------------------------------------------------------------------------------------+
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
   }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция проверки открытых оредров |
//+-----------------------------------------------------------------------------------------------+
int CountOrders() 
  {
   int cnt=0;
   int i=OrdersTotal()-1;
   for(int pos=i;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol)
           {
            if(OrderMagicNumber()==Magic) cnt++;
           }
        }
     }
   return(cnt);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на покупку |
//+-----------------------------------------------------------------------------------------------+
bool bSignalBuy()
  {
   if(dMA > Open[1] && dMA < Close[1])  //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика.
      return(true);

   return(false);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на продажу |
//+-----------------------------------------------------------------------------------------------+
bool bSignalSell()
  {
   if(dMA < Open[1] && dMA > Close[1])
      return(true);

   return(false);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на покупку |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenBuy()
  {
// Тикет ордера
   int iOTi = 0;   

   iOTi = OrderSend(Symbol(), OP_BUY, LOT(), Ask, Slippage, 0, 0, "", Magic, 0, clrNONE);
   
// Проверим открылся ли ордер
   if(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
      vOrderModify(iOTi);
   else
// Если нет, то получим ошибку
      vError(GetLastError());
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на продажу |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenSell()
  {
// Тикет ордера  
   int iOTi = 0;   
//Print(bCheckOrders());
   iOTi = OrderSend(Symbol(), OP_SELL, LOT(), Bid, Slippage, 0, 0, "", Magic, 0, clrNONE);

// Проверим открылся ли ордер
   if(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
      vOrderModify(iOTi);
   else
// Если нет, то получим ошибку
      vError(GetLastError());
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                                    Функция модификации ордера |
//+-----------------------------------------------------------------------------------------------+
void vOrderModify(int iOTi)
  {
   int    iOTy = -1;    // Тип ордера
   double dOOP = 0;     // Цена открытия ордера
   double dOSL = 0;     // Стоп Лосс
   int    iMag = 0;     // Идентификатор советника
   double dSL  = 0;     // Уровень убытка
   double dTP  = 0;     // Уровень прибыли

// Выберем по тикету открытый ордер, получим некоторые значения
   if(OrderSelect(iOTi, SELECT_BY_TICKET, MODE_TRADES))
     {
      iOTy = OrderType();
      dOOP = OrderOpenPrice();
      dOSL = OrderStopLoss();
      iMag = OrderMagicNumber();
     }

// Если ордер открыл данный советник, то входим в условие
   if(OrderSymbol() == Symbol() && OrderMagicNumber() == iMag)
     {
// Если Стоп Лосс текущего ордера равен нулю, то модифицируем ордер
      if(dOSL == 0)
        {
         if(iOTy == OP_BUY)
           {
            dSL = NormalizeDouble(dOOP - StopLoss * Point, Digits);
            dTP = NormalizeDouble(dOOP + TakeProfit * Point, Digits);

            bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
           }

         if(iOTy == OP_SELL)
           {
            dSL = NormalizeDouble(dOOP + StopLoss * Point, Digits);
            dTP = NormalizeDouble(dOOP - TakeProfit * Point, Digits);

            bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
           }
        }
     }
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                                      Функция обработки ошибок |
//+-----------------------------------------------------------------------------------------------+
void vError(int iErr)
  {
   switch(iErr)
     {
      case 129:   // Неправильная цена
      case 135:   // Цена изменилась
      case 136:   // Нет цен
      case 138:   // Новые цены
         Sleep(1000);
         RefreshRates();
         break;

      case 137:   // Брокер занят
      case 146:   // Подсистема торговли занята
         Sleep(3000);
         RefreshRates();
         break;
     }
  }
//+-----------------------------------------------------------------------------------------------+
double LOT()
{
   int n=0;
   int m=0;
   int v=0;
   double OL=Lot;
   for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
            if (OrderProfit()>0) 
            {

               if (n==0) OL=NormalizeDouble(OrderLots()+K_Martin1,DigitsLot);
               n++;
               
               if ((OL>=MaxMartinLot)&& (m==0)) OL=NormalizeDouble(OrderLots()*K_Martin2,DigitsLot);
               m++;
               
               if ((OL>=MaxMartinLot2) && (v==0)) OL=NormalizeDouble(OrderLots()*K_Martin3,DigitsLot);
               v++;
            }
            else
            {
               if (n==0) {return(Lot);}
               else {return(OL);}
            }
         }
      }
   }
   
   return(OL);
}
 
законопослушный гражданин #:

Preciso que a EA não consiga abrir uma nova encomenda na mesma vela.

void OnTick()
  {
  datetime cTime;
  static datetime time = 0;

  cTime = iTime(NULL, PERIOD_CURRENT, 0);

  if (time != cTime)
    time = cTime;
  else
    return;

// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
   }
Razão: