Магик устанавливаю так
#include <Trade\Trade.mqh> // подключаем библиотеку для совершения торговых операций CTrade my_Trade; // структура для выполнения торговых операций //+------------------------------------------------------------------+ bool codeExpertMagic() { string magic_str = ""; if(magic_num == 0) { // = номер символа string str = Symbol(); for(int i = 0; i < StringLen(str); i++) { int n = numChar(StringGetCharacter(str,i)); if(n < 0) { Print("Ошибка символа."); return(false); } magic_str += string(n); } // = номер периода int n = numPeriod(PeriodSeconds()); if(n < 0) { Print("Ошибка периода."); return(false); } magic_str += string(n); // = номер имени советника n = numExpertName(MQLInfoString(MQL_PROGRAM_NAME)); if(n < 0) { Print("Ошибка имени советника."); return(false); } magic_str += string(n); magic_set = StringToInteger(magic_str); } else magic_set = magic_num; my_Trade.SetExpertMagicNumber(magic_set); return(true); } //+------------------------------------------------------------------+ //--- открытие позиции bool putOrderStopLimit(MyPositionSet &pos_in, MyPositionGet &pos_out) { ...................... else if(pos_in.ord_type == order_type_market && my_Trade.Sell (pos_in.order_lot,Symbol(),NULL,pos_out.SL,pos_out.TP,comment_order) && my_Trade.ResultRetcode() == TRADE_RETCODE_DONE) { pos_out.order_set = true; pos_out.order_stop_set = false; pos_out.ticket = my_Trade.ResultOrder(); pos_in.magic = my_Trade.RequestMagic(); pos_in.order_direction = trend_dn; Print("magic = "+IntegerToString(pos_in.magic)); Print("balance = "+DoubleToString(my_Account.Balance(),2)); Print("lot = "+DoubleToString(pos_in.order_lot,2)); Print("Sell market. Ticket = "+string(pos_out.ticket)); } else { Comment("Ошибка установки ордера Sell"); Print("Ошибка установки ордера Sell"); return(false); } .............. } bool closePosition(MyPositionSet &pos_s, MyPositionGet &pos_g) { ResetLastError(); Print("Сохранённый магик = "+string(pos_s.magic)); if(my_Position.SelectByMagic(Symbol(),pos_s.magic)) { if(my_Position.SelectByTicket(pos_g.ticket)) { if(my_Trade.PositionClose(pos_g.ticket) && my_Trade.ResultRetcode() == TRADE_RETCODE_DONE) clearData(pos_s,pos_g); else { Print("ОШИБКА ЗАКРЫТИЯ ПОЗИЦИИ = "+IntegerToString(my_Trade.ResultRetcode())); Print(GetLastError()); ExpertRemove(); } } else { Print("Тикет не существует = "+string(pos_g.ticket)); Print("GetLastError = "+string(GetLastError())); ExpertRemove(); } } else { Print("Ошибка магика."); Print("GetLastError = "+string(GetLastError())); ExpertRemove(); } return(true); } //--- вызов закрытия позиции if(..........) { Print("Закрываем позицию SELL..."); Print("Магик позиции = "+string(my_Position.Magic())); decodeExpertMagic(my_Position.Magic()); closePosition(pos_set,pos_get); }
В журнале
HE 0 14:42:36.653 Core 1 2018.04.01 00:00:00 Советник получил MAGIC = 171226312914601707. JE 0 14:42:36.653 Core 1 2018.04.01 00:00:00 Советник WCInew_1.03 запущен на символе GBPUSD, период графика H1 KO 0 14:42:36.653 Core 1 2018.04.10 19:00:00 market sell 0.10 GBPUSD sl: 1.41792 (1.41592 / 1.41595 / 1.41592) FL 0 14:42:36.653 Core 1 2018.04.10 19:00:00 deal #2 sell 0.10 GBPUSD at 1.41592 done (based on order #2) HN 0 14:42:36.653 Core 1 2018.04.10 19:00:00 deal performed [#2 sell 0.10 GBPUSD at 1.41592] RG 0 14:42:36.653 Core 1 2018.04.10 19:00:00 order performed sell 0.10 at 1.41592 [#2 sell 0.10 GBPUSD at 1.41592] II 0 14:42:36.653 Core 1 2018.04.10 19:00:00 CTrade::OrderSend: market sell 0.10 GBPUSD sl: 1.41792 [done at 1.41592] DK 0 14:42:36.653 Core 1 2018.04.10 19:00:00 magic = 171226312914601707 PS 0 14:42:36.653 Core 1 2018.04.10 19:00:00 balance = 9999.72 OI 0 14:42:36.653 Core 1 2018.04.10 19:00:00 lot = 0.10 CN 0 14:42:36.653 Core 1 2018.04.10 19:00:00 Sell market. Ticket = 2 JI 0 14:42:36.653 Core 1 2018.04.10 19:00:00 Открыта позиция SELL с тикетом 2 EH 0 14:42:36.653 Core 1 2018.04.10 21:59:58 stop loss triggered #2 sell 0.10 GBPUSD 1.41592 sl: 1.41792 [#3 buy 0.10 GBPUSD at 1.41792] HF 0 14:42:36.653 Core 1 2018.04.10 21:59:58 deal #3 buy 0.10 GBPUSD at 1.41792 done (based on order #3) GJ 0 14:42:36.653 Core 1 2018.04.10 21:59:58 deal performed [#3 buy 0.10 GBPUSD at 1.41792] EL 0 14:42:36.653 Core 1 2018.04.10 21:59:58 order performed buy 0.10 at 1.41792 [#3 buy 0.10 GBPUSD at 1.41792] HQ 0 14:42:36.653 Core 1 2018.04.19 00:00:00 Закрываем позицию SELL... EH 0 14:42:36.653 Core 1 2018.04.19 00:00:00 Магик позиции = 0 MM 0 14:42:36.653 Core 1 2018.04.19 00:00:00 MAGIC выбран вручную. GG 0 14:42:36.653 Core 1 2018.04.19 00:00:00 Сохранённый магик = 171226312914601707 QF 0 14:42:36.653 Core 1 2018.04.19 00:00:00 Ошибка магика. JQ 0 14:42:36.653 Core 1 2018.04.19 00:00:00 GetLastError = 0 FK 3 14:42:36.653 Core 1 2018.04.19 00:00:00 ExpertRemove() function called
А теперь самое интересное....
Эксперт выставлял позицию со стоп-лоссом.
Как только указываю выставление позиции без стопов - всё работает без сбоев!
Каким боком и почему выставление стопов влияет на магик???
Изменил чутка функцию закрытия позиции
//+------------------------------------------------------------------+ bool closePosition(MyPositionSet &pos_s, MyPositionGet &pos_g) { ResetLastError(); if(my_Position.Select(Symbol()) && my_Position.SelectByMagic(Symbol(),pos_s.magic)) { if(my_Position.SelectByTicket(pos_g.ticket)) { if(my_Trade.PositionClose(pos_g.ticket) && my_Trade.ResultRetcode() == TRADE_RETCODE_DONE) { Print("Позиция с магиком "+string(pos_s.magic)+" и тикетом "+string(pos_g.ticket)+" успешно закрыта."); clearData(pos_s,pos_g); } else { Print("ОШИБКА ЗАКРЫТИЯ ПОЗИЦИИ = "+IntegerToString(my_Trade.ResultRetcode())); Print(GetLastError()); ExpertRemove(); } } else { Print("Тикет не существует = "+string(pos_g.ticket)); Print("GetLastError = "+string(GetLastError())); ExpertRemove(); } } else { if(!my_Position.Select(Symbol())) Print("Ошибка выбора позиции по символу "+Symbol()); if(!my_Position.SelectByMagic(Symbol(),pos_s.magic)) Print("Ошибка выбора позиции по магику."); Print("GetLastError = "+string(GetLastError())); ExpertRemove(); } return(true); } //+------------------------------------------------------------------+
И вообще офигел...
Советник получил MAGIC = 171226312914601707. // это получен при инициализации Советник WCInew_1.03 запущен на символе GBPUSD, период графика H1 market sell 0.10 GBPUSD sl: 1.42959 (1.42559 / 1.42562 / 1.42559) deal #2 sell 0.10 GBPUSD at 1.42559 done (based on order #2) deal performed [#2 sell 0.10 GBPUSD at 1.42559] order performed sell 0.10 at 1.42559 [#2 sell 0.10 GBPUSD at 1.42559] CTrade::OrderSend: market sell 0.10 GBPUSD sl: 1.42959 [done at 1.42559] magic = 171226312914601707 // это получен после открытия позиции balance = 9999.71 lot = 0.10 Sell market. Ticket = 2 Открыта позиция SELL с тикетом 2 stop loss triggered #2 sell 0.10 GBPUSD 1.42559 sl: 1.42959 [#3 buy 0.10 GBPUSD at 1.42959] deal #3 buy 0.10 GBPUSD at 1.42959 done (based on order #3) deal performed [#3 buy 0.10 GBPUSD at 1.42959] order performed buy 0.10 at 1.42959 [#3 buy 0.10 GBPUSD at 1.42959] Закрываем позицию SELL... Магик позиции = 171226312914601707 // это получен перед вызовом закрытия позиции Советник WCInew_1.03 запущен на символе GBPUSD, период графика H1 // это получен перед вызовом закрытия позиции Ошибка выбора позиции по символу GBPUSD // это ошибка в функции закрытия Ошибка выбора позиции по магику. // это ошибка в функции закрытия GetLastError = 4753 // это ошибка в функции закрытия ExpertRemove() function called
А вот без установки стопа
Открыта позиция SELL с тикетом 8 market buy 0.10 GBPUSD, close #8 (1.32826 / 1.32830 / 1.32826) deal #9 buy 0.10 GBPUSD at 1.32830 done (based on order #9) deal performed [#9 buy 0.10 GBPUSD at 1.32830] order performed buy 0.10 at 1.32830 [#9 buy 0.10 GBPUSD at 1.32830] CTrade::OrderSend: market buy 0.10 GBPUSD [done at 1.32830] Позиция с магиком 171226312914601707 и тикетом 8 успешно закрыта. final balance 10344.52 USD

- www.mql5.com
Ежики кололись, плакали, но продолжали жрать кактусы.
И как это поможет понять зависимость магика и тикета от открытия позиции с/без стопа?
И как это поможет понять зависимость магика и тикета от открытия позиции с/без стопа?
Попробуйте, это не страшно. На MQL4 писали?
Попробуйте, это не страшно. На MQL4 писали?
Нет. Только на 5-ке.
И разве тут дело в коде?
Нет. Только на 5-ке.
И разве тут дело в коде?
Тогда ладно. Но все равно было бы проще разобраться.
Я, к сожалению, не помогу.
Дело в том, что один и тот же код на одном и том же символе, на одном и том же ТФ но в одном конкретном советнике тупо не работает...
Это вывод из работающего
А это из не работающего
Что за беда?
Хотите найти ошибку: упростите код. Максимально упростите. И Вам станет понятнее, всё равно по вырванным кускам ничего не понятно.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Дело в том, что один и тот же код на одном и том же символе, на одном и том же ТФ но в одном конкретном советнике тупо не работает...
Это вывод из работающего
А это из не работающего
Что за беда?