Готов предложить Вам пищу для размышлений:
Стандартный кусок кода закрытия ордеров - работает...
Стандартный кусок кода закрытия ордеров - работает...
if(OrdersTotal() > 0) { for(ord = 0; ord < OrdersTotal(); ord++) { OrderSelect(ord,SELECT_BY_POS,MODE_TRADES); { if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic) { if(OrderType() == OP_BUY) { if(Условие закрытия) { OrderClose(OrderTicket(),OrderLots(),Bid,3,NONE); magic - внешняя переменная, значение сохраняется при открытии ордера
кусок кода открытия ордеров при пересечении МА - работает...
//-------------------------------------------------------------------- // Criterion.mqh // //--------------------------------------------------------------- 1 -- // Функция вычисления торговых критериев. // Возвращаемые значения: // 10 - открытие Buy // 20 - открытие Sell // 11 - закрытие Buy // 21 - закрытие Sell // 0 - значимых критериев нет //--------------------------------------------------------------- 2 -- // Внешние переменные: extern int Period_MA1 = 24; // Период расчётной МА1 extern int Period_MA2 = 48; // Период расчётной МА2 extern int Period_MA3 = 120; // Период расчётной МА3 //--------------------------------------------------------------- 3 -- int Criterion() // Пользовательская функция { double MA1_0, MA1_1, // Значение MA1 на 0 и 1 барах MA2_0, MA2_1, // Значение MA2 на 0 и 1 барах MA3_0, MA3_1; // Значение MA3 на 0 и 1 барах //--------------------------------------------------------------- 4 -- // Параметры технич. индикат: MA1_0=iMA(NULL,0,Period_MA1,0,MODE_EMA,PRICE_CLOSE,0); // 0 бар MA1_1=iMA(NULL,0,Period_MA1,0,MODE_EMA,PRICE_CLOSE,1); // 1 бар MA2_0=iMA(NULL,0,Period_MA2,0,MODE_EMA,PRICE_CLOSE,0); // 0 бар MA2_1=iMA(NULL,0,Period_MA2,0,MODE_EMA,PRICE_CLOSE,1); // 1 бар MA3_0=iMA(NULL,0,Period_MA3,0,MODE_EMA,PRICE_CLOSE,0); // 0 бар MA3_1=iMA(NULL,0,Period_MA3,0,MODE_EMA,PRICE_CLOSE,1); // 1 бар // Вычисление торговых критериев if (MA1_1 >= MA2_1 && MA2_1 >= MA3_1) return(10); // Открытие Buy if (MA1_1 < MA2_1 && MA2_1 < MA3_1) return(20); // Открытие Sell if (MA1_1 <= MA2_1 || MA2_1 <= MA3_1 || MA1_1<=MA3_1) return(11); // Закрытие Buy if (MA1_1 >= MA2_1 || MA2_1 >= MA3_1 || MA1_1>=MA3_1) return(21); // Закрытие Sell //---------------------------------------------------------- 5 -- return(0); // Выход из пользов. функции } //--------------------------------------------------------------- 7 --
Глянул
По видимому проблема в этом куске:
//| функция поиска торговых сигналов | int fsignals() { //поиск сигнала: если на выходе 1 - сигнал на покупку, если 2 - на продажу if((iMA(NULL,0,Fast_MA_Period,0,MA_Method,Applied_Price,1)>iMA(NULL,0,Slow_2_MA_Period,0,MA_Method,Applied_Price,1)) && ( (iMA(NULL,0,Fast_MA_Period,0,MA_Method,Applied_Price,1)>iMA(NULL,0,Slow_1_MA_Period,0,MA_Method,Applied_Price,1)) && ( ((iMA(NULL,0,Fast_MA_Period,0,MA_Method,Applied_Price,2)<iMA(NULL,0,Slow_1_MA_Period,0,MA_Method,Applied_Price,2)) || (iMA(NULL,0,Fast_MA_Period,0,MA_Method,Applied_Price,2)==iMA(NULL,0,Slow_1_MA_Period,0,MA_Method,Applied_Price,2)) &&(iMA(NULL,0,Fast_MA_Period,0,MA_Method,Applied_Price,3)<iMA(NULL,0,Slow_1_MA_Period,0,MA_Method,Applied_Price,3)) ) ) ) ) return(1); if((iMA(NULL,0,Fast_MA_Period,0,MA_Method,Applied_Price,1)<iMA(NULL,0,Slow_2_MA_Period,0,MA_Method,Applied_Price,1)) && ( (iMA(NULL,0,Fast_MA_Period,0,MA_Method,Applied_Price,1)<iMA(NULL,0,Slow_1_MA_Period,0,MA_Method,Applied_Price,1)) && ( ((iMA(NULL,0,Fast_MA_Period,0,MA_Method,Applied_Price,2)>iMA(NULL,0,Slow_1_MA_Period,0,MA_Method,Applied_Price,2)) || (iMA(NULL,0,Fast_MA_Period,0,MA_Method,Applied_Price,2)==iMA(NULL,0,Slow_1_MA_Period,0,MA_Method,Applied_Price,2)) &&(iMA(NULL,0,Fast_MA_Period,0,MA_Method,Applied_Price,3)>iMA(NULL,0,Slow_1_MA_Period,0,MA_Method,Applied_Price,3)) ) ) ) ) return(2); return(-1); } //end int fsignals()
сразу же брасются в глаза неправильные входные параметры в первой же строчке if:
extern int Fast_MA_Period = 5;
extern int Slow_1_MA_Period = 75;
extern int Slow_2_MA_Period = 85;
extern int MA_Method = 3 (должно быть 3 для Slow_MA_Period и 1 для Fast_MA_Period )
extern int Applied_Price = 1 (должно быть 0 для Fast_MA_Period и 3 для Slow_MA_Period )
if((iMA(NULL,0,Fast_MA_Period,0,MA_Method,Applied_Price,1)>iMA(NULL,0,Slow_2_MA_Period,0,MA_Method, Applied_Price,1))
marvelous:
Для вставки кода есть кнопка специальная, доступная при редактировании. Называется SRC

Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Покупка - пересечение быстрой МА медленных снизу вверх.
Продажа - пересечение быстрой МА медленных сверху вниз.
Открытие сделки происходит после закрытия свечи на которой состоялось пересечение.
Быстрая МА, период: 5, метод: exponential, применить: close.
Медленные МА, период 75 и 85, метод: linear weighted, применить: low.
Т/P 100 пунктов, S/L 50 пунктов, при уходе цены в + 40 пунктов S/L переносится в безубыток.
При не достижении цены уровня Т/P и поступает обратный сигнал, закрытие ордера и открытие обратного ордера.
Проблема в следующем, часто открытие происходит когда свеча пересекает медленные МА, что не соответствует алгоритму, также часто при поступлении противоположного сигнала не закрывается открытая сделка и не открывается противоположная.
Подскажите в чем причина?