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

AlexeyVik

Программист mql4 mql5
Такое у меня бывает, но редко, а я это не учитываю - вижу только тогда ошибку когда открыто одно направление - или только бай или только селл...Вернее, на бай ошибки то и нету, только на селл...
Вот моя функция опрелделения профита
Код:
Expand Collapse Copy
void ProfitOrders()
{
      int Total = OrdersTotal();
      ProfitBuy = 0; ProfitSel = 0;//Объявлены не глобальном уровне
      for(int i = 0; i < Total; i++)
       {
        if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
          if(OrderType() == OP_BUY) ProfitBuy = ProfitBuy+OrderProfit()+OrderSwap()+OrderCommission();
          if(OrderType() == OP_SELL) ProfitSel = ProfitSel+OrderProfit()+OrderSwap()+OrderCommission();
         }
       }
}//******************************************************************|
Всё работает без ошибок. Отличается от твоей только тем, что профит считается в валюте депозита и по всем ордерам одного направления вместе.
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
В пользовательской функции - сначала идёт void бла-бла-бла, потом цикл
Тогда ищи причину в том, что вызываешь функцию не своевременно.
Раздели переменные профита по направлениям и вызывай функцию непосредственно перед условием закрытия ордеров.
 

Алекc1234

Местный житель
Тогда ищи причину в том, что вызываешь функцию не своевременно.
Раздели переменные профита по направлениям и вызывай функцию непосредственно перед условием закрытия ордеров.

Если можно, изобрази, пожалуйста, хотя бы примерно, как это выглядит в коде...
 

AlexeyVik

Программист mql4 mql5
Ты не знаешь как объявляются переменные на глобальном уровне? Просто вне всех функций, можно сразу под параметрами extern
А вызов функции можно поставить в самом начале функции старт. После объявления локальных переменных.
 

Pivovarachkin

Новичок форума
Всем привет! Друзья кто поможет сделать робота, на основе одного индикатора с 2-мя периодами? я совсем ни бум бум в програмировании..
 

cfifcfif

Элитный участник
Ребят доброго вам здравия , у меня вопрос если заказать сову и хочетса что-бы ордера открывались быстренко как вы думайте быстрей ордера открыватса будут от тика или о начало 1 минуты ну или 5 вообщем надеюсь поняли очём я ?
 

Ugar

Гуру форума
Ребят доброго вам здравия , у меня вопрос если заказать сову и хочетса что-бы ордера открывались быстренко как вы думайте быстрей ордера открыватса будут от тика или о начало 1 минуты ну или 5 вообщем надеюсь поняли очём я ?
Основной код советника выполняется с приходом тика. Даже если задать условие открыть с начала минуты. Условие сработает на первом тике от начала минуты.

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

Алекc1234

Местный житель
Тогда ищи причину в том, что вызываешь функцию не своевременно.
Раздели переменные профита по направлениям и вызывай функцию непосредственно перед условием закрытия ордеров.

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

AlexeyVik

Программист mql4 mql5
Прошу прощения, есть ещё одно, что возможно важно - когда открывается рыночный ордер, то в рынке остаются ещё две стоповые отложки - байстоп и селлстоп. И тогда то расчёт на селл и производится неправильно. А вот стоило мне убрать их, как вроде всё правильно считается...
Да-уж. Столько времени ты упирался в то что не работает код... а оказалось, что не работает алгоритм...
Что касается нескольких рыночных и отложенных ордеров так это такое поле для фантазий, что я даже боюсь начинать этот диалог.
Ну ты пойми, что тебе самому надо научиться ставить задачу и находить формулу её решения. Это не арифметика, где можно по подобию что-то решить.
Представь себе, у меня тоже нет однозначного решения любой задачи. Я каждый советник или индикатор пишу как новый. Обязательно что-то да будет не так как в предыдущих.
 

vetallic

Местный знаток
всем прет - чет не работает расчет от открытия дня...
подскажите в чем ошибка?

double priceOpen = iOpen(Symbol(),1440,0);
double price1 = NormalizeDouble(priceOpen+30*Point,Digits);
double price2 = NormalizeDouble(priceOpen-30*Point,Digits);

if (Bid > price1) {BuyOrder();}
 

AlexeyVik

Программист mql4 mql5
всем прет - чет не работает расчет от открытия дня...
подскажите в чем ошибка?

double priceOpen = iOpen(Symbol(),1440,0);
double price1 = NormalizeDouble(priceOpen+30*Point,Digits);
double price2 = NormalizeDouble(priceOpen-30*Point,Digits);

if (Bid > price1) {BuyOrder();}
Я так полагаю, что это пользовательская функция...
А не в ней-ли проблема???
 

vetallic

Местный знаток
все разобрался, тупанул маленько, в другом месте лишний код был... :)
 

aufx

Интересующийся
Коллеги! Вот этот системный дескриптор окна какая нибудь функция использует?
Или он сам для себя существует.

int WindowHandle( string symbol, int timeframe)
Возвращает системный дескриптор окна (window handle), содержащего указанный график. Если график с symbol и timeframe на момент вызова функции не открыт, то возвращается 0.
 

AlexeyVik

Программист mql4 mql5
Коллеги! Вот этот системный дескриптор окна какая нибудь функция использует?
Или он сам для себя существует.

int WindowHandle( string symbol, int timeframe)
Возвращает системный дескриптор окна (window handle), содержащего указанный график. Если график с symbol и timeframe на момент вызова функции не открыт, то возвращается 0.
А WindowExpertName() ты где-нибудь используешь?
Так-же и WindowHandle() можно использовать для проверки.
И ещё используется в не документированных функциях. Таких как изменить ТФ графика, удалить с графика советник... Даже есть возможность закрыть окно графика и кажется весь терминал.
 

Ugar

Гуру форума
Коллеги! Вот этот системный дескриптор окна какая нибудь функция использует?
Или он сам для себя существует.

int WindowHandle( string symbol, int timeframe)
Возвращает системный дескриптор окна (window handle), содержащего указанный график. Если график с symbol и timeframe на момент вызова функции не открыт, то возвращается 0.
Странный вопрос. Все функции могут использоваться в пользовательской или специальной функции, в том числе и эта.
Если пока не доходит как её использовать, то можно не использовать. Но в один прекрасный момент, может всплыть задача, в решении которой эта функция окажется самой подходящей.
 

aufx

Интересующийся
А WindowExpertName() ты где-нибудь используешь?
Так-же и WindowHandle() можно использовать для проверки.
И ещё используется в не документированных функциях. Таких как изменить ТФ графика, удалить с графика советник... Даже есть возможность закрыть окно графика и кажется весь терминал.

"Не документируемые функции" ? Можно поподробнее?
 

aufx

Интересующийся
Странный вопрос. Все функции могут использоваться в пользовательской или специальной функции, в том числе и эта.
Если пока не доходит как её использовать, то можно не использовать. Но в один прекрасный момент, может всплыть задача, в решении которой эта функция окажется самой подходящей.

Наверное я не корректно задал вопрос.
Извиняюсь за наивность, но спрошу по другому.
Кроме как для определения открыто ли окно инструмента,для чего еще нужен этот "системный дескриптор"? Для чего-то он определяется.
 

qqmber

Почетный гражданин
Наверное я не корректно задал вопрос.
Извиняюсь за наивность, но спрошу по другому.
Кроме как для определения открыто ли окно инструмента,для чего еще нужен этот "системный дескриптор"? Для чего-то он определяется.

Посмотрите файл include\WinUser32.mqh Там описаны функции вызова WinAPI из user32.dll, и почти все из них принимают дескриптор как аргумент.
 

Ugar

Гуру форума
Наверное я не корректно задал вопрос.
Извиняюсь за наивность, но спрошу по другому.
Кроме как для определения открыто ли окно инструмента,для чего еще нужен этот "системный дескриптор"? Для чего-то он определяется.
1 Пример:
Допустим нужно что бы советник отличал свои ордера от чужих. Для этого используют Magic. А если нужно что бы после перезапуска терминала советник забыл свои старые ордера. В качестве magic можно использовать дескриптор окна. Маджики у все советников будут разными потому что дескрипторы разные. И при перезапуске советники забудут свои старые ордера, так как после перезапуска дескрипторы будут другими.
2 пример:
Допустим советник, при запуске терминала сильно тормозит. Или по другой причине, нужно что бы советники запускались не одновременно.
На первом тике после запуска ставим Sleep. Время задержки задаём рандомом. Но рандом генерит псевдо случайность. По этому у всех советников будут одинаковые значения. А вот если предварительно рандом генераторы инициализировать дескриптором окна, то в результате у всех советников будет выдержана разная пауза.
Если подумать можно придумать много примеров. Только зачем? Лучше действовать наоборот. Для решения задач искать подходящий инструментарий, вместо того что бы искать задачи по инструментарий.
 
Последнее редактирование:
Верх