Ваши вопросы по языку MQL4

eevviill

Заблокирован
Скажите, а можно написать так, что если ордер закрылся на определённой цене в минус(скажем на N пунктов больше, чем стоплосс или на N пунктов меньше чем цена открытия ордера?
Ну да. Типа так OrderClosePrice()==OrderOpenPrice()+14*Point
 

hoz

Активный участник
Ошибка 130 - неправильный стоп.
PHP:
Expand Collapse Copy
OrderOpenPrice() = 1.2789
i_sl_Norma = 1.2789
У тебя цена открытия ордера и стоп совпадают, естественно терминал не дает модифицировать ордер. Проверь переменную pt скорее всего она равна 0.


То что цены совпадают я сразу увидел, т.к. ошибка 130. Потому и принтовал. Код писал ночью, и полусонный в глобальных переменную pt обозвал интом:oops: Вот и понеслось... А дальше все расчёты и получение его значения не верны и в ноль всё. В общем нужно писать код либо раньше, либо бодрым.... А не по ночам.
 
Последнее редактирование:

hoz

Активный участник
hoz, небольшое замечание.
Каждая пара скобок увеличивает время выполнения кода. Поэтому если можно обойтись без них то упускать такую возможность не нужно. Я бы написал так.
MathAbs(Bid - iOpen(NULL, PERIOD_D1, 0)) / Point;


Алексей, а вот тут давайте остановимся... Недавно я искал решение какого-то вопроса, так вот наткнулся на ветку _http://forum.mql4.com/ru/44881

Рекомендую обратить внимание на пост drknn. Это, на сколько я в курсе, очень серьёзный и опытный программист. И, навряд ли, он ошибается.
Я ничего не утверждаю, но вот вышло 2 различных мнения.. Потому хочется этот вопрос разобрать и больше к нему не возвращаться..

Есть что добавить?
 
Последнее редактирование модератором:

AlexeyVik

Программист mql4 mql5
Формула расчёта количества пунктов от начала открытия дня до текущего момента будет такая:

PHP:
Expand Collapse Copy
MathAbs(( Ask - iOpen[Symbol(),1440,0] )) / MarketInfo(Symbol(),MODE_POINT}

Алексей, а вот тут давайте остановимся... Недавно я искал решение какого-то вопроса, так вот наткнулся на ветку _http://forum.mql4.com/ru/44881

Рекомендую обратить внимание на пост drknn. Это, на сколько я в курсе, очень серьёзный и опытный программист. И, навряд ли, он ошибается.
Я ничего не утверждаю, но вот вышло 2 различных мнения.. Потому хочется этот вопрос разобрать и больше к нему не возвращаться..

Есть что добавить?

Там речь идёт о других скобках. Может я не корректно выразился.
Я имел ввиду функции. Если сов работает только с той валютой на графике которой поставлен и не обращается к другим парам, то вместо Symbol() лучше написать NULL
В твоём варианте 3 лишних пары скобок (функции) которые можно заменить предопределёнными переменными в iOpen(Symbol(), 1440, 0) вместо Symbol() лучше написать NULL и вместо MarketInfo(Symbol(),MODE_POINT) написать Point

А что касается таких скобок о которых речь идёт в той теме, так я никогда не соглашусь с тем что такие лишние скобки гарантируют правильную работу кода. А вот заблудиться в этих лишних скобках как в лесу совсем не мудрено. Всё должно быть обосновано и логично.
 
Последнее редактирование модератором:

Versig

Новичок форума
Помогите! поменять имя в сове в MQL4 нешарю!
Может кому то выслал его или поясните что за чем открывать и менять, буду очень благодарен!
 
Последнее редактирование:

hoz

Активный участник
Если сов работает только с той валютой на графике которой поставлен и не обращается к другим парам, то вместо Symbol() лучше написать NULL


Ведь Symbol() это и есть текущий символ инструмента, почему нет? Смысла не улавливаю. Ведь если черпать данные с другого инструмента то вписывается в кавычках имя инструмента, например, "GBRUSD"

Там речь идёт о других скобках. Может я не корректно выразился.
Я имел ввиду функции. В твоём варианте 3 лишних пары скобок (функции) которые можно заменить предопределёнными переменными в iOpen(Symbol(), 1440, 0) вместо Symbol() лучше написать NULL и вместо MarketInfo(Symbol(),MODE_POINT) написать Point

А что касается таких скобок о которых речь идёт в той теме, так я никогда не соглашусь с тем что такие лишние скобки гарантируют правильную работу кода. А вот заблудиться в этих лишних скобках как в лесу совсем не мудрено. Всё должно быть обосновано и логично.


Я понял вашу логику, только вот таким образом код разрастается, появляются дополнительные переменные, а с ними и дополнительные ячейки памяти.. Это мысли вслух.. но есть же в этом логика.. вроде как.
 

hoz

Активный участник
Помогите! поменять имя в сове в MQL4 нешарю!
Может кому то выслал его или поясните что за чем открывать и менять, буду очень благодарен!


Эта ветка с вопросами по программированию а не "Курсы по освоению ПК".

А вообще "имя в сове" звучит довольно-таки двуяко. Можно прочесть как:
1. имя переменной в сове.
2. Название совы.

Если нужно второе то я выше уже ответил на твой вопрос.
 
Последнее редактирование:

Versig

Новичок форума
Эта ветка с вопросами по программированию а не "Курсы по освоению ПК".

А вообще "имя в сове" звучит довольно-таки двуяко. Можно прочесть как:
1. имя переменной в сове.
2. Название совы.

Если нужно второе то я выше уже ответил на твой вопрос.

2.Названия совы... Кто-то может за 1 мин. поменять, а я неумею так и прошу помощи!
 

Nata_FX

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

Versig

Новичок форума
Находишь сову в проводнике виндовс, нажимаешь F2, вводишь новое имя и вуаля. Выполнять надо при закрытом терминале.

Спасибо! А как-
1. имя переменной в сове.
Чтобы в МТ4 ,было другое имя
 
Последнее редактирование:

hoz

Активный участник
Я тут мудрил мудрил, и что-то сильно всё выходит длинно.
Как сделать чтоб ордера открывались по очерёдно? Т.е. buy и sell чередовались.
Можно, конечно, при открытии заглядывать в историю и находить последний в цикле ордер ближайший по времени и .. НО это слишком накладно по ресурсам и по количеству писанины.
Я так понимаю, это делается через флаги. Как это реализовать?

Вом моя торговая функция. Может в ней можно?

PHP:
Expand Collapse Copy
//+-------------------------------------------------------------------------------------+
//| Торговая функция                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade(int signal)
{
  if (signal == SIGNAL_BUY && FindOrders() == 0)
     if (!OpenBuy())
        return(false);
  
  if (signal == SIGNAL_SELL && FindOrders() == 0)
     if (!OpenSell())
        return(false);
        
  return(true);
}
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Ведь Symbol() это и есть текущий символ инструмента, почему нет? Смысла не улавливаю. Ведь если черпать данные с другого инструмента то вписывается в кавычках имя инструмента, например, "GBRUSD"

Я понял вашу логику, только вот таким образом код разрастается, появляются дополнительные переменные, а с ними и дополнительные ячейки памяти.. Это мысли вслух.. но есть же в этом логика.. вроде как.

Symbol() это функция определения текущего символа...
NULL это специальная константа (можно написать 0), а Point это предопределённая переменная которые не увеличивают количество переменных и не занимают дополнительных ресурсов, они по-любому присутствуют, даже если не загружено ни одного советника или пользовательского индикатора.
 

AlexeyVik

Программист mql4 mql5
Я тут мудрил мудрил, и что-то сильно всё выходит длинно.
Как сделать чтоб ордера открывались по очерёдно? Т.е. buy и sell чередовались.
Можно, конечно, при открытии заглядывать в историю и находить последний в цикле ордер ближайший по времени и .. НО это слишком накладно по ресурсам и по количеству писанины.
Я так понимаю, это делается через флаги. Как это реализовать?

Вом моя торговая функция. Может в ней можно?

PHP:
Expand Collapse Copy
//+-------------------------------------------------------------------------------------+
//| Торговая функция                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade(int signal)
{
  if (signal == SIGNAL_BUY && FindOrders() == 0)
     if (!OpenBuy())
        return(false);
  
  if (signal == SIGNAL_SELL && FindOrders() == 0)
     if (!OpenSell())
        return(false);
        
  return(true);
}
Ты действительно намудрил.
Как я понял, ты освоил написание и вызов пользовательских функций и теперь пишешь их где надо и не надо. (Без обид)
Зачем тебе две разных функции, в одной из которых определяется наличие ордера (любого типа) а в другой определяется есть-ли ордер нужного типа.
Я пользуюсь такой функцией
Код:
Expand Collapse Copy
int Buy, Sell; // на глобальном уровне

        void CountTrades()
           {
              Buy = 0; Sell = 0;
            int Total = OrdersTotal();
            for(int i = 0; i < Total; i++)
             {
              if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType() == OP_BUY) Buy++;
                if(OrderType() ==  OP_SELL) Sell++;
              }
             }//for
           }//*******************************************************|
Вызов этой функции можно ограничить условием if(Buy+Sell != OrdersTotal()) CountTrades();
А можно и на каждом тике вызывать.
Если используются отложенные ордера, то соответственно надо добавить переменные и подсчёт их в функции.
 

hoz

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


Какие могут быть обиды.. Наоборот, это очень ценное замечание!

Зачем тебе две разных функции, в одной из которых определяется наличие ордера (любого типа) а в другой определяется есть-ли ордер нужного типа.


А можно вот так:

PHP:
Expand Collapse Copy
    void CountTrades(int &Buy, int &Sell)
           {
              Buy = 0; Sell = 0;
              int Total = OrdersTotal();
              for(int i = 0; i < Total; i++)
              {
              if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType() == OP_BUY) Buy++;
               if(OrderType() ==  OP_SELL) Sell++;
              }
             }//for
           }//*******************************************************|


После вызова функции, как я понимаю, в той функции будут значения данных переменных. Немного изврат, конечно, но.. Просто недавно этот вопрос подымался, вот и вспомнил..


Вызов этой функции можно ограничить условием if(Buy+Sell != OrdersTotal()) CountTrades();
А можно и на каждом тике вызывать.
.


Зачем это условие и куда его добавить? Вроде как нет пользы с него..
 

AlexeyVik

Программист mql4 mql5
А можно вот так:

PHP:
Expand Collapse Copy
    void CountTrades(int &Buy, int &Sell)
           {
              Buy = 0; Sell = 0;
              int Total = OrdersTotal();
              for(int i = 0; i < Total; i++)
              {
              if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType() == OP_BUY) Buy++;
               if(OrderType() ==  OP_SELL) Sell++;
              }
             }//for
           }//*******************************************************|
После вызова функции, как я понимаю, в той функции будут значения данных переменных. Немного изврат, конечно, но.. Просто недавно этот вопрос подымался, вот и вспомнил..
В принципе конечно можно. Но я таким не пользуюсь. Отличий никаких, а переменная на глобальном уровне ИМХО надёжней.
Зачем это условие и куда его добавить? Вроде как нет пользы с него..
А это в int start() для того, чтобы не тратить время на обработку этой ф-ции на каждом тике, если предусмотрено открытие только по одному ордеру в каждую сторону. Но я там пропустил ещё условие Buy+Sell != 0
Если честно, то я отказался от этого. Выполнение достаточно быстрое.
 

hoz

Активный участник
Как известно, перебор открытых ордеров осуществляется с 0 до OrdersTotal(), т.е. так:

PHP:
Expand Collapse Copy
 for (int i = OrdersTotal() - 1; i >= 0; i --)


Но перебор закрытых ордеров как я заметил, да и в учебнике осуществляется от 0 до OrdersHistoryTotal() т.е так:

for (int i = 0; i < OrdersHistoryTotal(); i ++)


С чем это связано? Нулевой индексом не используется.. Почему?
 

eevviill

Заблокирован
Как известно, перебор открытых ордеров осуществляется с 0 до OrdersTotal(), т.е. так:

PHP:
Expand Collapse Copy
 for (int i = OrdersTotal() - 1; i >= 0; i --)


Но перебор закрытых ордеров как я заметил, да и в учебнике осуществляется от 0 до OrdersHistoryTotal() т.е так:

for (int i = 0; i < OrdersHistoryTotal(); i ++)


С чем это связано? Нулевой индексом не используется.. Почему?
Задом на перёд перебирают(необходимо) только при закрытии ордеров. Во всех остальных случаях нету разницы.
Я всегда перебираю задом наперёд.
 

hoz

Активный участник
Задом на перёд перебирают(необходимо) только при закрытии ордеров. Во всех остальных случаях нету разницы.
Я всегда перебираю задом наперёд.

Я не это имел ввиду. Разница в том, что так открытые ордера не перебирают:

PHP:
Expand Collapse Copy
 for (int i = OrdersTotal(); i >= 0; i --)


Перебирают так:

PHP:
Expand Collapse Copy
 for (int i = OrdersTotal() - 1; i >= 0; i --)


А закрытые почему-то так не перебирают:

PHP:
Expand Collapse Copy
for (int i = 0; i < OrdersHistoryTotal() - 1; i ++)


А перебирают так:

PHP:
Expand Collapse Copy
for (int i = 0; i < OrdersHistoryTotal(); i ++)
 
Верх