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

 
datetime some_time=TimeCurrent();
//extern string Symbol3 = ""; //Инструмент (""текущий по умолчанию)
extern int P=1;          //Таймфрейм
extern int MagicNumber = 100500;  // Установили магик


int start()
{

int send;
                                     
double SL=200;                                   
double TP=200;                       
double Lots=1;       

for(int i = OrdersTotal(); i >=0; i--)                                            // цикл для проверки ордеров
{
int af=OrderSelect(i, SELECT_BY_POS,MODE_TRADES);                                // Шаг 1: OrderSelect Выбираем ордер (SELECT_BY_POS - по порядковому номеру), (MODE_TRADES -из отложенных и открытых)

if((OrderSymbol() == "EURUSD") && (OrderMagicNumber() == MagicNumber))return(0); // Шаг 2: Если символ EURUSD отсутствует,И если ордер присутствует , и ни один из ордеров НЕ содержит магикномер, то выходим из цикла.( выходим -значит откр. позицию) 
                                                                                    (если какое-либо условие из двух указанных не совпадает, то выходим) 
}
          

             
if ((Close[0]>High[1]))
{
send=OrderSend("EURUSD",OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,MagicNumber);
}

if ((Close[0]<Low[1]))  
{
send=OrderSend("EURUSD",OP_SELL,Lots,Bid,3,Ask+SL*Point,Ask-TP*Point,MagicNumber);
}

return(0);
}

Meu entendimento é que é como uma verificação periódica da disponibilidade. (Há EURUSD? e há uma ordem com a magia especificada?) Se alguma das condições estiver faltando, abrimos uma posição. Somente se ambas as condições forem cumpridas, abrimos uma posição.

Em seguida, somos questionados na etapa 2. Suponha que tenhamos um pedido aberto manualmente. Então atendemos à primeira condição (temos o mesmo símbolo) e não atenderemos à segunda condição, já que esta ordem não contém magia. E se uma das condições não corresponder, então o código deve abrir o pedido. Isto é exatamente o que o código faz. Mas no próximo tick, abre o terceiro, quarto e quinto pedidos.....

Por que abre uma terceira encomenda?

Mas há dois pedidos que atendem a ambas as condições no total. Deve haver um cheque (mudança para retornar(0)), não uma abertura. e não a abertura.

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Boa noite a todos! Você pode me dizer se você pode escrever um código em mql5 que desenhará uma linha no gráfico (figura anexa) e registrar todas as coordenadas dessa linha no arquivo? Se você quiser usar esta linha como base para o futuro, então você precisa usá-la como uma base para o robô comercial. direto
 
GlushkoV_V_V:
Boa noite a todos! Você pode me dizer se você pode escrever um código em mql5 que desenhará uma linha no gráfico (figura anexa) e registrar todas as coordenadas dessa linha no arquivo? Se você quiser traçar uma linha e preenchê-la com as coordenadas, então você precisa fazer um traçado simples da linha.

Tudo está na documentação.

Документация по MQL5: Графические объекты / ObjectCreate
Документация по MQL5: Графические объекты / ObjectCreate
  • www.mql5.com
[in]  Номер подокна графика. 0 означает главное окно графика. Указанное подокно должно существовать, в противном случае функция возвращает false. Возвращает true при успешной постановке команды в очередь указанного графика, иначе false. Если объект был уже создан ранее, то производится попытка изменить его координаты. При вызове ObjectCreate...
 
Сергей Таболин:

Tudo está na documentação.

Obrigado pela dica, talvez você possa me ajudar a construir um destes de graça, é claro.

 
GlushkoV_V_V:

Obrigado pela dica, mas talvez você possa me ajudar a construir uma dessas coisas, não de graça, é claro.

Não de graça - isso é para você)))

Торговые приложения для MetaTrader 5 на заказ
Торговые приложения для MetaTrader 5 на заказ
  • www.mql5.com
Убрать из советника второй индикатор заменить другим,изменить условие открытие ордера .Условие сделки покупка: НМА линия вверх второй индикатор столбик гистограмы выше нуля (второй индикатор пересечение нуля точка входа) по закрытой свече если нма и второй индикатор не изменили показания совершается покупка для продаже наоборот.Изменить...
 
Muito obrigado, mas para mim é como em chinês e eu não sei como implementá-lo no código.
 
Alexey Belyakov:

Meu entendimento é que é como uma verificação periódica da disponibilidade. (Há EURUSD? e há uma ordem com a magia especificada?) Se alguma das condições estiver faltando, abrimos uma posição. Somente se ambas as condições forem cumpridas, abrimos uma posição.

Em seguida, somos questionados na etapa 2. Suponha que tenhamos um pedido aberto manualmente. Então atendemos à primeira condição (temos o mesmo símbolo) e não atenderemos à segunda condição, já que esta ordem não contém magia. E se uma das condições não corresponder, então o código deve abrir o pedido. Isto é exatamente o que o código faz. Mas no próximo tick, abre o terceiro, quarto e quinto pedidos.....

Por que abre uma terceira encomenda?

Mas há dois pedidos que atendem a ambas as condições no total. Deve haver um cheque (mudança para retornar(0)), não uma abertura. mas não a abertura.

== - se for igual != - se não for igual. Continuidade - iteração de fim de loop e início de uma nova iteração de loop. Quebra - terminação do ciclo e transição para o próximo operador após o ciclo, retorno - terminação da função, no seu caso Onstart e à espera de um novo tick. E se um pedido com seu magik estiver aberto, ele deve terminar a função e sair para esperar por um novo tick.

Pergunta, se você deseja abrir um pedido na janela atual, por que você precisa especificar a ferramenta explicitamente, ou você deseja abrir pedidos a partir da janela de outra ferramenta? Também não está claro quantos pedidos você quer abrir. De acordo com seu código, somente uma ordem pode ser aberta e somente após o seu fechamento, a segunda será aberta. Você tem um mágico e uma ferramenta de janela aberta. Além disso, as condições de abertura do pedido são verificadas para o instrumento atual e não para o Eurobucks.

datetime some_time=TimeCurrent();
//extern string Symbol3 = ""; //Инструмент (""текущий по умолчанию)
extern int P=1;          //Таймфрейм
extern int MagicNumber = 100500;  // Установили магик


int start()
{

int send;
                                     
double SL=200;                                   
double TP=200;                       
double Lots=1;       

for(int i = OrdersTotal(); i >=0; i--)                                            // цикл для проверки ордеров
{
bool af=OrderSelect(i, SELECT_BY_POS,MODE_TRADES);     // OrderSelect возвращает тип bool                           
                                               // Шаг 1: OrderSelect Выбираем ордер 
                                   //(SELECT_BY_POS - по порядковому номеру), (MODE_TRADES -из отложенных и открытых)

if((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber))return(0); // Шаг 2: Если символ Выбранного ордера 
                                        //равен EURUSD (заменено на текущий инструмент открытого окна) ,
                                       // И если магик Выбранного ордера равен магик то выходим из функции Онстарт.
// Если же наш ордер не будет выбран из ордеров терминала, то цикл закончится и начнется выставление ордеров. 
                                                                                   
}
          

             
if ((Close[0]>High[1])) // клоз и хай здесь для текущего окна и инструмента. 
{
send=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,MagicNumber); // так же здесь цены аск и бид тоже для текущего инструмента
}

if ((Close[0]<Low[1]))  
{
send=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+SL*Point,Ask-TP*Point,MagicNumber); // и поинт кстати тоже.
}

return(0);
}
 
Valeriy Yastremskiy:

== - se for igual != - se não for igual. Kontinue - termina a iteração de loop e inicia uma nova iteração de loop. Intervalo - termina o loop e vai para o próximo operador que segue o loop, volta - termina a função, no seu caso OnStart e espera por um novo tick. E se um pedido com seu magik estiver aberto, ele deve terminar a função e sair para esperar por um novo tick.

Pergunta, se você deseja abrir um pedido na janela atual, por que você precisa especificar a ferramenta explicitamente, ou você deseja abrir pedidos a partir da janela de outra ferramenta? Também não está claro quantos pedidos você quer abrir. De acordo com seu código, somente uma ordem pode ser aberta e somente após o seu fechamento, a segunda será aberta. Você tem um mágico e uma ferramenta de janela aberta. Além disso, as condições de abertura do pedido são verificadas para o instrumento atual e não para o Eurobucks.

- Sim, eu quero abrir na janela atual;

- Um pedido. O próximo pedido não é aberto até que o pedido anterior seja fechado.

"Também, as condições de abertura do pedido são verificadas para o instrumento atual e não para o Eurobucks" - então ?

((OrderSymbol() == "EURUSD" )  ???
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
 
Alexey Belyakov:

- Sim, eu quero abrir na janela atual;

- Um pedido. O próximo pedido não é aberto até que o pedido anterior seja fechado.

"Também as condições de abertura do pedido são verificadas para o instrumento atual e não para o Eurobucks" - então ?

E o que então, por exemplo, você tem uma janela aberta não Eurobucks, mas o Eurofunt, você compara o símbolo do pedido selecionado com Eurobucks, se for verdade, então no Eurobucks há um pedido, e se nosso magik, então retornado da função OnStart, e se não, então nós estabelecemos um pedido no Eurobucks, mas Kloz, High, Asc, Bid, você terá um erro ao abrir pedidos, porque Bid e Asc para estes instuents são diferentes. E Symbol() devolverá o símbolo da janela atual e nenhum erro ocorrerá.

Você pode usar um modelo do meta editor, há um Novo botão na parte superior esquerda. A função OnStart ainda é usada, mas não está correta, e OnStart é para scripts. O modelo certo.

//+------------------------------------------------------------------+
//|                                                    forumtest.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                                  https://qstr.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://qstr.ru"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

Código correto. Seu comentário de pedido está faltando e o mágico não está contabilizado em seu código. Nos avisos à nota da linha de abertura Conversão implícita de um número em um fio!!!

//+------------------------------------------------------------------+
//|                                                    forumtest.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                                  https://qstr.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://qstr.ru"
#property version   "1.00"
#property strict

datetime some_time=TimeCurrent();
//extern string Symbol3 = ""; //Инструмент (""текущий по умолчанию)
extern int P=1;          //Таймфрейм
extern int MagicNumber = 100500;  // Установили магик
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int send;
                                     
double SL=200;                                   
double TP=200;                       
double Lots=1;       

for(int i = OrdersTotal(); i >=0; i--)                                            // цикл для проверки ордеров
{
bool af=OrderSelect(i, SELECT_BY_POS,MODE_TRADES);     // OrderSelect возвращает тип bool                           
                                               // Шаг 1: OrderSelect Выбираем ордер 
                                   //(SELECT_BY_POS - по порядковому номеру), (MODE_TRADES -из отложенных и открытых)

if((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber))return; // Шаг 2: Если символ Выбранного ордера 
                                        //равен EURUSD (заменено на текущий инструмент открытого окна) ,
                                       // И если магик Выбранного ордера равен магик то выходим из функции Онстарт.
// Если же наш ордер не будет выбран из ордеров терминала, то цикл закончится и начнется выставление ордеров. 
                                                                                   
}
          

             
if ((Close[0]>High[1])) // клоз и хай здесь для текущего окна и инструмента. 
{
send=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,"My order",MagicNumber,0,clrGreen); // так же здесь цены аск и бид тоже для текущего инструмента

}

if ((Close[0]<Low[1]))  
{
send=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+SL*Point,Ask-TP*Point,"My order",MagicNumber,0,clrGreen); // и поинт кстати тоже.
}

return;
  }
//+------------------------------------------------------------------+
 
Valeriy Yastremskiy:

há muitos erros em seu exemplo

for(int i = OrdersTotal(); i >=0; i--)  

deveria haver:

for(int i = OrdersTotal()-1; i >=0; i--)  

aqui os preços não são normalizados OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,"My order",MagicNumber,0,clrGreen);

Aqui não entendo a lógica por que a saída do OnTick() é necessária se a condição é falsa.

if((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber))return;

talvez, devemos continuar com o laçoe simplesmente calcular quantos pedidos existem

Seu exemplo é muito simples na lógica e seria difícil modificá-lo para outras tarefas... talvez ele gostasse de acrescentar o trailing