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

 
Maxim Kuznetsov:
Parece que o texto original vem de um universo paralelo, foi traduzido duas vezes pelo google-translate e depois recontado por Alice :-)

Certo. Há uma função que pode ser usada para encontrar o último lote. É chamado deFindLastLots. Mas eu quero fazer uma função que não procure apenas o último lote, mas com a ajuda do qual você pode mudar muito. Isto é, se lotes externos = 0,01; quero mudar os lotes = 0,01, digamos, para 0,04 usandoesta função. E aqui preciso de ajuda para entender como ela pode ser implementada em geral.

double FindLastLots()
  {
   double oldlots=0;
   int oldticket;
   int ticket=0;

   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               oldlots= OrderLots();
               ticket = oldticket;
              }
           }
        }
     }
   return(oldlots);
  }
Общие принципы - Торговые операции - Справка по MetaTrader 5
Общие принципы - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
 
Corvin85:

...

mudar lotes = 0,01, digamos para 0,04. Sem usar multiplicação.

...

Bem... se a multiplicação for um problema, você pode obter o resultado desejado através da adição.

 
Alexey Viktorov:

Bem... se a multiplicação for um problema, você pode obter o resultado desejado adicionando.

-:)

sem dizer
 
Posso adicionar um loop de tempo a esta função, para que eu possa passar pela variável externa um a um nas ordens selecionadas? Mas como posso então extrair o "valor de retorno" e usá-lo?
 
Alexey Viktorov:

Bem... se houver problemas com a multiplicação, você pode obter o resultado desejado através da adição.

Entendo seu sarcasmo, mas que em casos de multiplicação ou de cálculo, deve haver tantos multiplicadores quanto há variáveis externas Lotes. Essa não é uma maneira de sair da situação. Embora seja honesto, pensei nisso...

 
Olá!!! Estou fazendo um EA baseado em um M5 timeframe.... mas os sinais são acionados (por exemplo às 9:33, 12:11) etc..... você pode me dizer como abrir um pedido em uma vela nova se o sinal estava na vela atual?
 
Corvin85:

Entendo seu sarcasmo, mas que em casos de multiplicação ou de cálculo, deve haver tantos multiplicadores quanto há variáveis externas Lotes. Essa não é uma maneira de sair da situação. Embora eu vá ser honesto, já pensei sobre isso.

Não consigo me lembrar dos detalhes neste momento, mas me foi pedido algo complicado no cálculo de Lotes. Como resultado, foi encontrada uma fórmula pela qual o cálculo foi feito.

Talvez seja melhor você declarar a ordem em detalhes? Então, alguém pode sugerir esta fórmula.

 
Alexey Viktorov:

Não consigo me lembrar dos detalhes agora, mas recebi ordens para fazer algo elaborado no cálculo do lote. O resultado foi uma fórmula que foi usada para calculá-la.

Talvez seja melhor você declarar a ordem em detalhes? Então, alguém pode sugerir esta fórmula.

#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double Lot  = 0.01;
extern double Lot2  = 0.02;
extern double Lot3  = 0.05;
extern double Lot3  = 0.07;
//----------- И так далее-------//

Há várias variáveis externas de Lote. Se uma ordem é fechada por Stop Loss, uma nova ordem é aberta com o novo lote que é especificado na variável externa. (Talvez fosse assim que deveríamos tê-lo escrito originalmente). Eu simplesmente não sei como escrevê-lo corretamente em código. E como escrevi acima, nenhuma multiplicação ou cálculo, nenhum multiplicador externo ajudará. Precisamos, de alguma forma, analisar os dados das ordens fechadas.

 
Corvin85:

Há várias variáveis externas Lote. Se uma ordem é fechada pela StopLoss, então uma nova ordem abre com um novo lote, que é especificado na variável externa. (Talvez, isto deveria ter sido originalmente escrito desta forma) E aqui está o engate. Eu simplesmente não sei como escrevê-lo corretamente em código. E como escrevi acima, nenhuma multiplicação ou cálculo, nenhum multiplicador externo ajudará. Precisamos, de alguma forma, recuperar dados de pedidos fechados ...

Ao abrir uma ordem, escreva o número da regra/variável no comentário.

então quando você verificar o histórico - pegue este número, acrescente 1 a ele e obtenha um novo número de regra

 
Corvin85:

Há várias variáveis externas Lote. Se uma ordem é fechada pela StopLoss, então uma nova ordem abre com um novo lote, que é especificado na variável externa. (Talvez, isto deveria ter sido originalmente escrito desta forma) E aqui está o engate. Eu simplesmente não sei como escrevê-lo corretamente em código. Como escrevi acima, nenhuma multiplicação ou cálculo, nenhum multiplicador externo ajudará. Temos que analisar de alguma forma os dados das ordens fechadas.

Experimente este código, talvez isto seja o que você precisa

#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict

input double Lot_01  = 0.1;
input double Lot_02  = 0.2;
input double Lot_03  = 0.3;
input double Lot_04  = 0.4;
input double Lot_05  = 0.5;
input double Lot_06  = 0.6;
input double Lot_07  = 0.7;

double GetNextLot(const double last_lot)
{
   if(last_lot>=Lot_07) return(Lot_07);
   if(last_lot>=Lot_06) return(Lot_07);
   if(last_lot>=Lot_05) return(Lot_06);
   if(last_lot>=Lot_04) return(Lot_05);
   if(last_lot>=Lot_03) return(Lot_04);
   if(last_lot>=Lot_02) return(Lot_03);
   if(last_lot>=Lot_01) return(Lot_02);
   return(Lot_01);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   Print(Lot_01," ---> ",GetNextLot(Lot_01));
   Print(Lot_02," ---> ",GetNextLot(Lot_02));
   Print(Lot_03," ---> ",GetNextLot(Lot_03));
   Print(Lot_04," ---> ",GetNextLot(Lot_04));
   Print(Lot_05," ---> ",GetNextLot(Lot_05));
   Print(Lot_06," ---> ",GetNextLot(Lot_06));
   Print(Lot_07," ---> ",GetNextLot(Lot_07));
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
void OnTick()
  {

   
  }
//+------------------------------------------------------------------+

2019.11.28 22:31:26.409 tst EURUSD,H1: 0.7 ---> 0.7

2019.11.28 22:31:26.409 tst EURUSD,H1: 0.6 ---> 0.7

2019.11.28 22:31:26.409 tst EURUSD,H1: 0.5 ---> 0.6

2019.11.28 22:31:26.409 tst EURUSD,H1: 0.4 ---> 0.5

2019.11.28 22:31:26.409 tst EURUSD,H1: 0.3 ---> 0.4

2019.11.28 22:31:26.409 tst EURUSD,H1: 0.2 ---> 0.3

2019.11.28 22:31:26.409 tst EURUSD,H1: 0.1 ---> 0.2

Em minha função GetNextLot() você alimenta o volume da última ordem fechada, e ele retornará o próximo valor da configuração do Lote_XX

a única limitação neste código é que os lotes devem estar em ordem ascendente - acho que o código é simples e direto, você pode modificá-lo de acordo com suas necessidades

Razão: