Анализ выполняется только после открытия очередного бара. Если нужен потиковый расчет, просто уберите условие в функции start().
Если быстрая скользящая выше, закрываем (если есть) ордер на продажу и открываемся в покупку.
Если медленная скользящая выше, закрываем (если есть) ордер на покупку и открываемся в продажу.
GetLuft() - функция позволяет задавать "люфт" пересечения машек.
//+------------------------------------------------------------------+ extern int FastPeriod = 1; extern int FastShift = 0; extern int FastMetod = 0; extern int FastPrice = 0; extern int SlowPeriod = 2; extern int SlowShift = 0; extern int SlowMetod = 0; extern int SlowPrice = 0; extern int TryCount = 5; extern int WaitTime = 2; extern int SlipPage = 2; //+------------------------------------------------------------------+ int init() { return(0); } //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ int start() { static datetime LastTimeBar = D'01.01.2004 00:00:00'; if (LastTimeBar < Time[0]) { LastTimeBar = Time[0]; DoAnalysis(); } return(0); } //+------------------------------------------------------------------+ void DoAnalysis() { double Luft = GetLuft(); double DeltaMA = iMA(Symbol(), 0, iMAFastPeriod, iMAFastShift, iMAFastMetod, iMAFastPrice, 1) - iMA(Symbol(), 0, iMASlowPeriod, iMASlowShift, iMASlowMetod, iMASlowPrice, 1); if (NormalizeDouble(DeltaMA, Digits) > NormalizeDouble(Luft, Digits)) DoBuy(); else { if (NormalizeDouble(DeltaMA, Digits) < NormalizeDouble(-Luft, Digits)) DoSell(); } } //+------------------------------------------------------------------+ double GetLuft() { return (0.0); } //+------------------------------------------------------------------+ void DoBuy() { bool IsOrderClose, IsBuyOrderExist = false; for (int iOrder = OrdersTotal() - 1; iOrder >= 0; iOrder--) { if (OrderSelect(iOrder, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol()) { if (OrderType() == OP_BUY) IsBuyOrderExist = true; else { for (int Try1 = 1; Try1 <= TryCount; Try1++) { if (OrderType() == OP_SELL) IsOrderClose = OrderClose(OrderTicket(), OrderLots(), Ask, SlipPage); if (IsOrderClose) { Print("Ордер на продажу успешно закрыт!"); break; } else { if (Try1 == TryCount) Print("Не удалось закрыть ордер!"); } Sleep(WaitTime*1000); } } } } else Print("Не удалось выбрать ордер!"); } if (!IsBuyOrderExist) { for (int Try2 = 1; Try2 <= TryCount; Try2++) { int Ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, SlipPage, 0, 0); if (Ticket < 0) { if (Try2 == TryCount) Print("Не удалось открыть новый ордер!"); } else { Print("Открыт ордер на покупку!"); break; } Sleep(WaitTime*1000); } } } //+------------------------------------------------------------------+ void DoSell() { bool IsOrderClose, IsSellOrderExist = false; for (int iOrder = OrdersTotal() - 1; iOrder >= 0; iOrder--) { if (OrderSelect(iOrder, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol()) { if (OrderType() == OP_SELL) IsSellOrderExist = true; else { for (int Try1 = 1; Try1 <= TryCount; Try1++) { if (OrderType() == OP_BUY) IsOrderClose = OrderClose(OrderTicket(), OrderLots(), Bid, SlipPage); if (IsOrderClose) { Print("Ордер на покупку успешно закрыт!"); break; } else { if (Try1 == TryCount) Print("Не удалось закрыть ордер!"); } Sleep(WaitTime*1000); } } } } else Print("Не удалось выбрать ордер!"); } if (!IsSellOrderExist) { for (int Try2 = 1; Try2 <= TryCount; Try2++) { int Ticket = OrderSend(Symbol(), OP_SELL, 0.1, Bid, SlipPage, 0, 0); if (Ticket < 0) { if (Try2 == TryCount) Print("Не удалось открыть новый ордер!"); } else { Print("Открыт ордер на продажу!"); break; } Sleep(WaitTime*1000); } } } //+------------------------------------------------------------------+
Анализ выполняется только после открытия очередного бара. Если нужен потиковый расчет, просто уберите условие в функции start().
Если быстрая скользящая выше, закрываем (если есть) ордер на продажу и открываемся в покупку.
Если медленная скользящая выше, закрываем (если есть) ордер на покупку и открываемся в продажу.
GetLuft() - функция позволяет задавать "люфт" пересечения машек.
Извините,я не программист.Скопировал Вашу прогу,скомпелировал,дает ошибки.Почему?
extern int iMAFastPeriod = 1;
extern int iMAFastShift = 0;
extern int iMAFastMetod = 0;
extern int iMAFastPrice = 0;
extern int iMASlowPeriod = 2;
extern int iMASlowShift = 0;
extern int iMASlowMetod = 0;
extern int iMASlowPrice = 0;
extern int iMAFastPeriod = 1;
extern int iMAFastShift = 0;
extern int iMAFastMetod = 0;
extern int iMAFastPrice = 0;
extern int iMASlowPeriod = 2;
extern int iMASlowShift = 0;
extern int iMASlowMetod = 0;
extern int iMASlowPrice = 0;
Спасибо.Ошибок нет.Сейчас протестирую.Посмотрю,что покажет.В принципе мне нужен только звуковой сигнал при пересечении,а ТС своя.
Это будет звук отлива депозита.:)
Правило Белого Мишки №52: Пересечение двух средних запаздывает сильнее, чем пересечение какой либо из средних с ценой.
valex, чем вас MACD не устраивает, нормальный индюкатор, сливает медленно, в соответствие с конвергенциями ?
Еще раз говорю,мне неважно сливает он или нет.И вообще мне не нужен советник,нужен индикатор.А если есть советник,то только с установкой ордера,чтобы я его мог отменить.Мне нужен звук,а запаздывает он или опережает,это уже дело третье.Я же не работаю только с двумя средними.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Господа программисты,здавствуйте!
Прошу Вас ответить на вопрос.
Существует ли программа индикатора или советника,которая подает сигнал при пересечении двух средних.
Спасибо за ответ.