Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 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);
}

Я понимаю так, что идёт как бы переодический опрос на наличие. (есть ли  EURUSD? и есть ли ордер с указанным Magic(ом))  Если чего-то одного нет, то открываем позицию. Только в случае совпадении обоих условий, отправляется на проверку. 

И тогда спрашивается в Шаге2. Предположим мы имеем один ордер открытый вручную. Тогда мы попадаем под первое условие, (имеем тот же символ) и  не попадаем под второе условие, так как  этот ордер не содержит magic. А если одно из условий не совпадает, то код должен открыть ордер. Собственно он так и делает. Но в следующий тик он открывает и третий ордер, и четвётртый, и пятый....

Почему он открывает третий ордер?

Но ведь есть же два ордера которые в сумме попадают под оба условия. Должна быть далее проверка (переход в return(0)) , а не открытие.!

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Доброй ночи всем! Подскажите можно ли написать код на mql5 который будет рисовать прямую на графике(фото прикрепил) и записывать все координаты этой прямой в файл? после отслеживание експертом(роботом) пробоя(пересечение) графиком этой прямой.                                   прямая
 
GlushkoV_V_V:
Доброй ночи всем! Подскажите можно ли написать код на mql5 который будет рисовать прямую на графике(фото прикрепил) и записывать все координаты этой прямой в файл? после отслеживание експертом(роботом) пробоя(пересечение) графиком этой прямой.                                  

Всё есть в документации.

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

Всё есть в документации.

Спасибо за подсказку, а может вы поможете собрать такую штуку не за бесплатно конечно же.

 
GlushkoV_V_V:

Спасибо за подсказку, а может вы поможете собрать такую штуку не за бесплатно конечно же.

Не за бесплатно - это Вам сюда )))

Торговые приложения для MetaTrader 5 на заказ
Торговые приложения для MetaTrader 5 на заказ
  • www.mql5.com
Убрать из советника второй индикатор заменить другим,изменить условие открытие ордера .Условие сделки покупка: НМА линия вверх второй индикатор столбик гистограмы выше нуля (второй индикатор пересечение нуля точка входа) по закрытой свече если нма и второй индикатор не изменили показания совершается покупка для продаже наоборот.Изменить...
 
Огромное вам спасибо ,но для меня это как на китайском ничего понятно как это реализовать в коде
 
Alexey Belyakov:

Я понимаю так, что идёт как бы переодический опрос на наличие. (есть ли  EURUSD? и есть ли ордер с указанным Magic(ом))  Если чего-то одного нет, то открываем позицию. Только в случае совпадении обоих условий, отправляется на проверку. 

И тогда спрашивается в Шаге2. Предположим мы имеем один ордер открытый вручную. Тогда мы попадаем под первое условие, (имеем тот же символ) и  не попадаем под второе условие, так как  этот ордер не содержит magic. А если одно из условий не совпадает, то код должен открыть ордер. Собственно он так и делает. Но в следующий тик он открывает и третий ордер, и четвётртый, и пятый....

Почему он открывает третий ордер?

Но ведь есть же два ордера которые в сумме попадают под оба условия. Должна быть далее проверка (переход в return(0)) , а не открытие.!

== - если равно    != - если не равно. Континью - завершение итерации цикла и начало новой итерации цикла. Брейк - завершение цикла и переход к следующему за циклом оператору, ретурн - завершение функции, в вашем случае Онстарт и ожидание нового тика. И если ордер с вашим магик открыт, должен завершить функцию и уйти на ожидание нового тика.

Вопрос, если хотите открывать в текущем окне ордера, то зачем явно прописывать инструмент, или вы хотите открывать ордера из окна другого инстумента? Так же не понятно, сколько ордеров хотите открывать. По логике вашего кода может открываться только один ордер и только после его закрытия будет открываться второй. У вас один магик и один инструмент открытого окна. Так же условия открытия ордера проверяются для Текущего инструмента, а не для евробакса.

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:

== - если равно    != - если не равно. Континью - завершение итерации цикла и начало новой итерации цикла. Брейк - завершение цикла и переход к следующему за циклом оператору, ретурн - завершение функции, в вашем случае Онстарт и ожидание нового тика. И если ордер с вашим магик открыт, должен завершить функцию и уйти на ожидание нового тика.

Вопрос, если хотите открывать в текущем окне ордера, то зачем явно прописывать инструмент, или вы хотите открывать ордера из окна другого инстумента? Так же не понятно, сколько ордеров хотите открывать. По логике вашего кода может открываться только один ордер и только после его закрытия будет открываться второй. У вас один магик и один инструмент открытого окна. Так же условия открытия ордера проверяются для Текущего инструмента, а не для евробакса.

- Да, хочу открывать в текущем окне;

- Один ордер. Следующий ордер не открывается, пока не закроется предыдущий. 

"Так же условия открытия ордера проверяются для Текущего инструмента, а не для евробакса."  - тогда ?

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

- Да, хочу открывать в текущем окне;

- Один ордер. Следующий ордер не открывается, пока не закроется предыдущий. 

"Так же условия открытия ордера проверяются для Текущего инструмента, а не для евробакса."  - тогда ?

А что тогда, у вас например открыто окно не евробакс, а еврофунт, вы сравниваете символ выбранного ордера с евробаксом, если истина, значит на евробаксе есть ордер, и если и с нашим магик, то ретурн из функции Онстарт, а если нет, то выставляем ордер на евробаксе, но клоз, Хай, аск, бид у вас будут для еврофунт. будет ошибка при открытии ордеров, так как бид и аск для этих инстументов разные. А Symbol() возвратит символ текущего окна и ошибки не возникнет.

И используйте шаблон из метаэдитор, там есть кнопочка Создать слева вверху. Функцию онстарт используют до сих пор, но это не правильно, а ОнСтарт это для скриптов. Правильный шаблон.

//+------------------------------------------------------------------+
//|                                                    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()
  {
//---
   
  }
//+------------------------------------------------------------------+

Правильный код. У Вас пропущен комментарий к ордеру, и магик в вашем коде не учитывается. В предупреждениях к строке открытия замечание Неявное приведение типа числа к строке!!!

//+------------------------------------------------------------------+
//|                                                    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:

ошибок много в Вашем примере

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

должно быть:

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

тут цены не нормализованные  OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,"My order",MagicNumber,0,clrGreen); 

тут вообще не понятна логика зачем выход из OnTick() если условие ложное

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

наверное нужно продолжить цикл перебора ордеров  и просто посчитать сколько ордеров

имхо, или топик с "Только полезные функции от КимIV" поиском найдите или в КБ посмотрите как делают советников с подсчетом ордеров и выставлением новых ордеров, Ваш пример очень прямолинеен в логике и в дальнейшем его сложно будет модифицировать под другие задачи... ну может быть трейлинг он захочет прикрутить

Причина обращения: