zhserg
Местный знаток
Уважаемые, прикрутите сигнал к индюку, он меняет цвет при пересечении уровней 0,25 и -0,25. нужен сигнал при этих пересечениях.
Вложения
Последнее редактирование:
Уважаемые, прикрутите сигнал к индюку, он меняет цвет при пересечении уровней 0,25 и -0,25. нужен сигнал при этих пересечениях.
Ребята,поменяйте пожалуйста советнику вид ордеров.Чтобы вместо стоповых,он ставил лимитники.Поменяйте пожалуйста.
Потому что просто поменять "вид ордеров" в большинстве своем не правильно...Спасибо! но он почему то ошибку выдаёт ((
Поправил:
Такой уж исходный индикатор, я же не волшебникРисует он правда :not-good:
Помогите пожалуйста в доработке индикатора.
Индикатор предназначен для прогнозирования направления движения цены на следующей свече.
Проблема, с которой я столкнулся – это появление ложных сигналов. При присоединении индикатора к графику я вижу отличную статистику прибыльных сделок на истории (75-80% прибыльных сделок). Но во время тестирования в тестере стратегий, появляются сигналы на тех же свечах за исключением 1-2 свечей (просто не появляются сигналы на них ) в течение суток на 15-ти минутном таймфрейме плюс много ложных сигналов. На других таймфреймах то же самое. Мое подозрение пало на неправильный расчет баров при тестировании, в MQL4 я не силен, точно утверждать не могу. Причем индикатор НЕ РИСУЕТ. Он делает расчет уже на основе исторических данных – тиковых объемов и цен открытия и закрытия свечей с 1 по 6, то есть уже сформировавшихся, и выдает сигнал на нулевой (формирующейся) свече.
Прикрепляю скриншоты от 01 мая 2014г. Один из них – сигналы индикатора SOT_DOT_6 NEW.mq4 на истории пары EURCHF без ложных сигналов. Другой скрин - сигналы этого же индикатора после тестирования на тестере стратегий с ложными сигналами. Свечи с ложными сигналами выделены красными линиями. Например, в 04:15, 10:15, 14:00, 22:30, 22:45. Если сравнить эти скриншоты, то можно увидеть и другие ложные сигналы, но я не стал их отмечать, чтобы не загромождать скриншот.
Я заметил еще одну особенность в поведении ложных сигналов. Допустим, при тестировании на тестере стратегий у нас появился очередной сигнал на свече. Пока мы не знаем, ложный он или нет. Ждем появления следующего сигнала. После того, как появился следующий сигнал, удаляем индикатор с графика и затем снова присоединяем индикатор к графику. Если предыдущий сигнал не исчез с графика, то он был настоящим, если исчез – то был ложным. Если не дожидаться появления следующего сигнала, то даже после отрисовки нескольких свечей удаляя индикатор с графика и затем снова присоединяя его к графику, предыдущий сигнал в любом случае будет сохраняться, даже если в последствии выяснится, что он был ложным.
Fillelin,V papkie metatreidera "indicators" jiest obie peredielanyjie versii, piervaja versija indikatorv,kotoruju vy peredielali (TMA i T3) jiest v papkie "indicators" otkrytovo terminala,a vtoroj versii nietu...
Terminal peregruzhal nieskolko raz...dazhe restartiraval kompiuter-niepojavilis...
Posmotritie pozhalujsta,v chiom prichina ...
Spasibo vam ogromnojie
Poslie regulirovki nastrojek,leibly na drugich TMA ischiezajiet...no poslie obnovlienija grafika-pojavliajietsa...tak shto rabotat mozhno...Пробуйте так:
Доброе утро. Помогите доработать советник на Белом тигре: он использует два индикатора, один - на графике, один - на осциллографе, смысл такой, что, когда сигналы на обоих индикаторах совпадают, например, они оба красные - происходит продажа, зеленые - покупка. Однако советник заключает сделки неправильно, мне кажется, что я не так прописал сигналы или условие выставления/закрытия ордеров. Помогите разобраться, подскажите что не так. Код советника ниже. Спасибо.
PHP:#property copyright "Copyright 2014, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" extern double Lots = 0.1; extern int TakeProfit = 100 ; extern int StopLoss = 50 ; extern int Slippage = 5; extern string comment = "WT BOT"; extern int Magic = 123; double Sig1, Sig2, Sig3, Sig4, SL, TP; int ticket; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { if (Digits == 3 || Digits == 5) { TakeProfit *= 10; StopLoss *= 10; Slippage *= 10; } return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int Signal_1,Signal_2 ; // индикатор в осциллографе Sig1 = iCustom(Symbol(), 0, "SFCC5", 3, 1); //зеленый Sig1 = NormalizeDouble(Sig1,Digits); Sig2 = iCustom(Symbol(), 0, "SFCC5", 4, 1); //красный Sig2 = NormalizeDouble(Sig2,Digits); // индикатор на графике Sig3 = iCustom(Symbol(), 0, "SFCS5", 1, 1); //зеленый Sig3 = NormalizeDouble(Sig3,Digits); Sig4 = iCustom(Symbol(), 0, "SFCS5", 0, 1); //красный Sig4 = NormalizeDouble(Sig4,Digits); { if( Sig1 != EMPTY_VALUE && Sig2 == EMPTY_VALUE)Signal_1=1;//зеленый if( Sig1 == EMPTY_VALUE && Sig2!= EMPTY_VALUE)Signal_1=2;//красный if( Sig3 != EMPTY_VALUE && Sig4 == EMPTY_VALUE)Signal_2=1;//зеленый if( Sig3 == EMPTY_VALUE && Sig4 != EMPTY_VALUE)Signal_2=2;//красный } if((Signal_1 ==1 && Signal_2 == 1) && (CountSell() > 0)) //зеленый и есть ордера на продажу. то закрываем { for (int i = OrdersTotal ()-1; i >=0; i--) { if(OrderSelect (i, SELECT_BY_POS, MODE_TRADES) == true) { if (OrderMagicNumber () == Magic && OrderType() == OP_SELL ) OrderClose (OrderTicket(), OrderLots (), Ask, Slippage, Black); } } } if((Signal_1 == 2 && Signal_2 == 2) && (CountBuy() > 0))//красный и есть ордера на покупку. то закрываем { for (i = OrdersTotal ()-1; i >=0; i--) { if(OrderSelect (i, SELECT_BY_POS, MODE_TRADES) == true) { if (OrderMagicNumber () == Magic && OrderType() == OP_BUY ) OrderClose (OrderTicket(), OrderLots (), Bid, Slippage, Black); } } } if((Signal_1 == 1 && Signal_2 == 1) && (CountBuy() == 0))//зеленый и нет ордера на покупку. то открываем { SL = NormalizeDouble(Ask - StopLoss * Point, Digits); TP = NormalizeDouble(Ask + TakeProfit * Point, Digits); ticket = OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, Blue); if (ticket > 0) { if( OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES) == true) OrderModify (ticket, OrderOpenPrice(), SL, TP, 0); } } if((Signal_1 == 2 && Signal_2 == 2) &&( CountSell() == 0))//красный и нет ордера на продажу. то открываем { SL = NormalizeDouble(Bid + StopLoss * Point, Digits); TP = NormalizeDouble(Bid - TakeProfit * Point, Digits); ticket = OrderSend (Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Red); if (ticket > 0) { if( OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES) == true) OrderModify (ticket, OrderOpenPrice(), SL, TP, 0); } } return(0); } //+------------------------------------------------------------------+ int CountSell () { int count = 0; for (int trade = OrdersTotal()-1; trade >= 0; trade--) { OrderSelect (trade, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol () == Symbol()&& OrderMagicNumber () == Magic) { if (OrderType () == OP_SELL) count++; } } return(count); } //+------------------------------------------------------------------+ int CountBuy () { int count = 0; for (int trade = OrdersTotal()-1; trade >= 0; trade--) { OrderSelect (trade, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol () == Symbol()&& OrderMagicNumber () == Magic) { if (OrderType () == OP_BUY) count++; } } return(count); } //+------------------------------------------------------------------+]
Подскажите как в своём терминале запустить счёт если известны IP адреса торговых серверов для работы? В каком файле терминала прописывать ip адрес торгового сервера?
bool flOrderWasClose = false;
for (int i=OrdersTotal()-1; i>=0; i--) {
OrderSelect(i,...);
flOrderWasClose = flOrderWasClose || OrderClose(OrderTicket(),...);
}
bool flOrderWasClose = false;
for (int i=OrdersTotal()-1; i>=0; i--) {
OrderSelect(i,...);
if (!flOrderWasClose) flOrderWasClose = flOrderWasClose || OrderClose(OrderTicket(),...);
else OrderClose(OrderTicket(),...);
}
Попробуй лучше такой оператор _http://docs.mql4.com/ru/basis/operators/ternary здесь использовать. Думаю тебе понравится.Для дорабатывающих/перерабатывающих советников под новые билды терминала - только что столкнулся с неожиданным "подарком" компилятора, который стал гораздо умнее...
Итак, в советнике есть цикл, пробегающий по всем открытым ордерам и закрывающий часть из них (например, OP_BUY) при определенном условии и использующий bool флаг, указывающий - была ли закрыта хоть одна позиция. Логика цикла представлена ниже:
В старых билдах компилятор генерил код, который вызывал OrderClose() для всех ордеров, выбранных в OrderSelect().Код:bool flOrderWasClose = false; for (int i=OrdersTotal()-1; i>=0; i--) { OrderSelect(i,...); flOrderWasClose = flOrderWasClose || OrderClose(OrderTicket(),...); }
В новых билдах (у меня - 670й) - OrderClose() срабатывал только один раз. Затем компилятор смотрел - ага, flOrderWasClose уже равна true, и дальше уже не изменится, значит OrderClose() можно не вызывать.
Я долго не мог понять, почему не закрываются все ордера при срабатывании условия, пока не вспомнил Webinar по Java, где чувак рассказывал про то, что тамошний runtime-оптимизатор тоже может выбрасывать часть кода, результат работы которого в дальнейшем не используется.
Так что - будьте внимательны! Новый компилер может быть хитрее, чем вы думаете :laugh:
P.S. А тот код, который выше, я переписал так:
и это работает, как надо.Код:bool flOrderWasClose = false; for (int i=OrdersTotal()-1; i>=0; i--) { OrderSelect(i,...); if (!flOrderWasClose) flOrderWasClose = flOrderWasClose || OrderClose(OrderTicket(),...); else OrderClose(OrderTicket(),...); }
Не представляю, как этот оператор здесь можно использовать...Попробуй лучше такой оператор _http://docs.mql4.com/ru/basis/operators/ternary здесь использовать. Думаю тебе понравится.