Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1179

 
Mikhail:

Когда делаю вот такой запрос:

получаю вот такой результат:

2020.06.17 13:49:53.270 2020.01.02 06:50:00   Symbol EURUSD_i Digits 5 Point 1e-05

Когда делаю вот такой запрос:

получаю вот такой результат:

2020.06.17 13:51:58.787 2020.01.02 06:45:00   Symbol EURUSD_i Digits 0 Point 0.0

При этом хочу заметить, что если я не вставляю функцию Print, то вообще никаких ошибок не происходит, ордер даже не пытается модифицироваться. Как будто бы CTrade не видит мой ордер.

Проверка на символ и мэджик номер не проходит:

Результат:

2020.06.17 14:37:38.147 2020.01.02 06:50:00   Symbol  Magic 0 Ticket 2

Мэджик должен быть 12345, символ евро доллар. 

Почему не удается получить символ и меджик?

Если строку:

поменять на 

и убрать проверку по мэджик номеру, то появляются проблемы с ценами

2020.06.17 01:38:24.136 2020.01.02 07:40:00   failed modify order #2 buy stop 0.1 EURUSD_i at 1.12086 sl: 1.12023 tp: 1.12275 -> 1.00000, sl: 1.00000 tp: 1.00000 [Invalid price]

2020.06.17 01:38:24.136 2020.01.02 07:40:00   CTrade::OrderSend: modify #2 at 1.00000 (sl: 1.00000 tp: 1.00000) [invalid price]

2020.06.17 01:38:24.136 2020.01.02 07:40:00   Модификация BUY STOP прошла с ошибкой! Result Retcode: 10015, description of Retcode: invalid price

Голову уже себе сломал. при том что этот же код в другом советнике работает на ура.

Что я делаю не так?

у вас неверно инициализируется (или вообще не)  объект класса CSymbolInfo.

если у вас нету такой строки asymbol.Name(Symbol())  то добавьте.

Если есть, дебажьте в функции Name(string symbol) что происходит.

заполнение полей m_digits итд в функции Refresh().

з.ы. судя по тому что вы дописали у вас точно asymbol неинициализирован.

 
Mikhail:

Пока новый тик не пришел, перемещение кнопок не происходит. Это я глазами вижу. Как только цена изменилась, кнопки переместились.

Хотя сегодня даже на новом тике кнопки перестали перерисовываться, хотя я ничего не менял. Двигается только фон.

Разъясняю - как вы говорите вы меняете координаты в ОнТик, и утверждаете что фактически кнопки перемещаются на СЛЕДУЮЩЕМ тике. На следующем от чего? от того, на котором вы поменяли координаты, или от рождества христова?

 
Aleksey Mavrin:

у вас неверно инициализируется (или вообще не)  объект класса CSymbolInfo.

если у вас нету такой строки asymbol.Name(Symbol())  то добавьте.

Если есть, дебажьте в функции Name(string symbol) что происходит.

заполнение полей m_digits итд в функции Refresh().

з.ы. судя по тому что вы дописали у вас точно asymbol неинициализирован.

в самом верху кода у меня стоят строчки 
#include <Trade\Trade.mqh>
#include <Trade\OrderInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\DealInfo.mqh>
#include <Trade\SymbolInfo.mqh>

CTrade atrade;
COrderInfo aorder;
CPositionInfo apos;
CDealInfo adeal;
CSymbolInfo asymbol;

Является ли это инициализацией? При компиляции получаю следующую информацию

'Панель для торговли.mq5' Панель для торговли.mq5 1 1

'Trade.mqh' Trade.mqh 1 1

'Object.mqh' Object.mqh 1 1

'StdLibErr.mqh' StdLibErr.mqh 1 1

'OrderInfo.mqh' OrderInfo.mqh 1 1

'HistoryOrderInfo.mqh' HistoryOrderInfo.mqh 1 1

'PositionInfo.mqh' PositionInfo.mqh 1 1

'DealInfo.mqh' DealInfo.mqh 1 1

'SymbolInfo.mqh' SymbolInfo.mqh 1 1

code generated 1 1

0 errors, 0 warnings, 3192 msec elapsed 1 1

После открытия ордера Buy Stop пересчитываю все ордера, выбираю открытый ордер и делаю проверку на совпадение символа и мэждик номера: 

for(int i=OrdersTotal()-1;i>=0;i--)
          if(aorder.SelectByIndex(i))  
              if(aorder.Symbol()==asymbol.Name() && aorder.Magic()==MagicNumber && Ask < aorder.PriceOpen())

На этом этапе ничего не происходит, так как я уже писал выше функция asymbol.Name() почему-то не возвращает символ открытого ордера, функция aorder.Magic() возвращает значение 0 (хотя мой мэджик 121345), функция asymbol.TickSize() возвращает значение 0. То есть проверка не проходит и соответственно дальнейшая работа с ордером прекращается. Поясните пожалуйста "дебажьте в функции Name(string symbol) что происходит", не  совсем понимаю эту фразу. Что нужно добавить и куда?

 
Aleksey Mavrin:

Разъясняю - как вы говорите вы меняете координаты в ОнТик, и утверждаете что фактически кнопки перемещаются на СЛЕДУЮЩЕМ тике. На следующем от чего? от того, на котором вы поменяли координаты, или от рождества христова?

 Думаю, что последовательность такая: приходит новый тик, я меняю координаты панели, фон панели начинает двигаться в нужное мне место, кнопки в это время стоят на месте, приходит новый тик и кнопки перемещаются в след за панелью в нужно место. А что можно генерировать тики прям от Рождества Христова? 
 
Mikhail:

На этом этапе ничего не происходит, так как я уже писал выше функция asymbol.Name() почему-то не возвращает символ открытого ордера, функция aorder.Magic() возвращает значение 0 (хотя мой мэджик 121345), функция asymbol.TickSize() возвращает значение 0. То есть проверка не проходит и соответственно дальнейшая работа с ордером прекращается. Поясните пожалуйста "дебажьте в функции Name(string symbol) что происходит", не  совсем понимаю эту фразу. Что нужно добавить и куда?

Ошибка в индексе / тикете ордера может быть судя по магик 0. На момент обращения к структуре ордера там записаны данные не того ордера который нужен. В цикле отбора может быть что в последний ордерселект уходит следующий номер, а не нужный Вам. Из структуры ордера возвращаются данные именно последнего ордерселекта.

 
Mikhail:
в самом верху кода у меня стоят строчки 

Является ли это инициализацией? При компиляции получаю следующую информацию

'Панель для торговли.mq5' Панель для торговли.mq5 1 1

'Trade.mqh' Trade.mqh 1 1

'Object.mqh' Object.mqh 1 1

'StdLibErr.mqh' StdLibErr.mqh 1 1

'OrderInfo.mqh' OrderInfo.mqh 1 1

'HistoryOrderInfo.mqh' HistoryOrderInfo.mqh 1 1

'PositionInfo.mqh' PositionInfo.mqh 1 1

'DealInfo.mqh' DealInfo.mqh 1 1

'SymbolInfo.mqh' SymbolInfo.mqh 1 1

code generated 1 1

0 errors, 0 warnings, 3192 msec elapsed 1 1

После открытия ордера Buy Stop пересчитываю все ордера, выбираю открытый ордер и делаю проверку на совпадение символа и мэждик номера: 

На этом этапе ничего не происходит, так как я уже писал выше функция asymbol.Name() почему-то не возвращает символ открытого ордера, функция aorder.Magic() возвращает значение 0 (хотя мой мэджик 121345), функция asymbol.TickSize() возвращает значение 0. То есть проверка не проходит и соответственно дальнейшая работа с ордером прекращается. Поясните пожалуйста "дебажьте в функции Name(string symbol) что происходит", не  совсем понимаю эту фразу. Что нужно добавить и куда?

Блин, зачем вы используете то что не понимаете (а вдруг это ядрёный чемоданчик )) ) 

И ещё и не додумываетесь прочесть что пишут

если у вас нету такой строки asymbol.Name(Symbol())  то добавьте.

з.ы. хотел ещё объяснить что такое инициализация, но видимо и это будет бесполезно
 
Valeriy Yastremskiy:

Ошибка в индексе / тикете ордера может быть судя по магик 0. На момент обращения к структуре ордера там записаны данные не того ордера который нужен. В цикле отбора может быть что в последний ордерселект уходит следующий номер, а не нужный Вам. Из структуры ордера возвращаются данные именно последнего ордерселекта.

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

Добрый день!

Помогите решить одну простую задачу. 

Счётчик гэпов. Хочу посчитать гэпы, которые больше 10 пунктов.

int start()
{
int gap=0;
int r=MathAbs(Close[2]-Open[1])/Point;
if (r>=10)
{
gap=gap+1;
}
Comment("ГЭП!========: ",gap,"\n",
        "ВЕЛИЧИНА ГЭПА==: ",r,"\n");
return(0);

 Переменную "gap" сбрасывает в ноль. Не пойму почему. Я уже, что только не перепробывал. Циклы вставлял,  и static - не помогает. Подозреваю, что циклы неправильно писал. 

 
Alexey Belyakov:

Добрый день!

Помогите решить одну простую задачу. 

Счётчик гэпов. Хочу посчитать гэпы, которые больше 10 пунктов.

 Переменную "gap" сбрасывает в ноль. Не пойму почему. Я уже, что только не перепробывал. Циклы вставлял,  и static - не помогает. Подозреваю, что циклы неправильно писал. 

Переменная gap находится в области видимости функции start - и при каждом новом тике она заново инициализируется нулём

 
Alexey Belyakov:

Добрый день!

Помогите решить одну простую задачу. 

Счётчик гэпов. Хочу посчитать гэпы, которые больше 10 пунктов.

 Переменную "gap" сбрасывает в ноль. Не пойму почему. Я уже, что только не перепробывал. Циклы вставлял,  и static - не помогает. Подозреваю, что циклы неправильно писал. 

int gap=0;
int start()
{
int r=MathAbs(Close[2]-Open[1])/Point;
if (r>=10)
{
gap++;
}
Comment("ГЭП!========: ",gap,"\n",
        "ВЕЛИЧИНА ГЭПА==: ",r,"\n");
return(0);
int start()
{
static int gap=0;
int r=MathAbs(Close[2]-Open[1])/Point;
if (r>=10)
{
gap=gap+1;
}
Comment("ГЭП!========: ",gap,"\n",
        "ВЕЛИЧИНА ГЭПА==: ",r,"\n");
return(0);
Причина обращения: