Вообщем не понимаю или я идиот, или ерунда какая то или проблема тестера....
Вообщем пишу я трал в советник, где в один момент трал выставляет сделку в безубыток, и потом снова тралит по старому критерию (по iSAR) как только значение нового стопа будет больше чем уже выставленный в беззубыток стоп. А если более обширно то нужно просто что бы трал не менял лося если новый меньше чем уже стоящий (больше меньше при покупке, больше при продаже). У меня же трал в нужный момент выставляет лося в беззубыток, и тут же или через какое то время меняет его на более маленький, эт при покупке. Дело происходит в тестере. Подскажи те что неправельно делаю. А пишу я это дело так:
Надо так
// ТРЕЙЛИНГ ПО ParabolicSar // значение индикатора на 3-ом баре, по которому необходимо трейлинговать и отступ (пунктов) - // расстояние от значения индикатора, на которое переносится стоплосс (от 0) //----------------------------------------------------------------- //--------------------------------------------------------------- 1 -- // Функция модификации StopLoss всех ордеров указанного типа // Глобальные переменные: // Mas_Ord_New Массив ордеров последний известный //--------------------------------------------------------------- 2 -- void SARTrailing_texbook(int Tip) { int Ticket; // Номер ордера double Price, // Цена открытия рыночного ордера TS, // TralingStop (относит.знач.цены) SL, // Значение StopLoss ордера TP; // Значение TakeProfit ордера bool Modify; // Признак необходимости модифи. int j; double prev_Sar; // значение SAR на 1-ом баре double new_extremum; double newstop; // новый стоплосс Level_new=MarketInfo(Symbol(),MODE_STOPLEVEL ); // мин уровень трала Modify=false; // Пока не назначен к модифи Price = OrderOpenPrice(); // Цена открытия ордера SL = OrderStopLoss(); // Значение StopLoss ордера TP = OrderTakeProfit(); // Значение TakeProft ордера Ticket= OrderTicket(); // Номер ордера //----------------------------------------------------------- prev_Sar = iSAR (Symbol(),0, Step, Maximum, 3); switch(Tip) // Переход на тип ордера { case 0 : // Ордер Buy if (trlinloss==false){ // тралим только профит if (( ( (prev_Sar - (indent+ MarketInfo(Symbol(),MODE_SPREAD))*Point) > NormalizeDouble(SL,Digits)) || (NormalizeDouble(SL,Digits)==0)) && (prev_Sar - (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point < Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) && prev_Sar < Bid && NormalizeDouble(Price,Digits) < NormalizeDouble(prev_Sar - (indent+ MarketInfo(Symbol(),MODE_SPREAD))*Point,Digits)) // Если ниже желаемого и в профите { // то модифицируем его SL = prev_Sar - (indent+ MarketInfo(Symbol(),MODE_SPREAD))*Point; // Новый его StopLoss Modify=true; // Назначен к модифи. } } else { if (( ( (prev_Sar - (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point) > NormalizeDouble(SL,Digits)) || (NormalizeDouble(SL,Digits)==0)) && (prev_Sar - (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point < Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) && prev_Sar < Bid) // Если ниже желаемого { // то модифицируем его SL = prev_Sar - (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point; // Новый его StopLoss Modify=true; // Назначен к модифи. } } break; // Выход из switch case 1 : // Ордер Sell if (trlinloss==false){ // тралим только профит if ( ( ( (prev_Sar + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point) < NormalizeDouble(SL,Digits)) || (NormalizeDouble(SL,Digits)==0)) && (prev_Sar + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point > Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) && prev_Sar > Ask && NormalizeDouble(Price,Digits) > NormalizeDouble(prev_Sar + (indent+MarketInfo(Symbol(),MODE_SPREAD))*Point,Digits)) { // то модифицируем его SL = prev_Sar + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point; // Новый его StopLoss Modify=true; // Назначен к модифи. } } else { if ( ( ( (prev_Sar + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point) < NormalizeDouble(SL,Digits)) || (NormalizeDouble(SL,Digits)==0)) && (prev_Sar + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point > Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) && prev_Sar > Ask) { // то модифицируем его SL = prev_Sar + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point; // Новый его StopLoss Modify=true; // Назначен к модифи. } } } // Конец switch if (Modify==false) // Если его не надо модифи.. return; // ..то идём по циклу дальше bool Ans=OrderModify(Ticket,Price,SL,TP,0,Olive);//Модифицируем его! //--------------------------------------------------------- 5 -- if (Ans==false) // Не получилось :( { // Поинтересуемся ошибками: Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError()); return; // .. то уходим. } // Выход из пользов. функции } //--------------------------------------------------------------- 6 --
Вызов этой ф-ии из СТАРТА эксперта
if (UseTrailing==1 && orderCount > 0 && type == 7) // трал по аналогии учебнику - по SAR { if (orderType == OP_BUY) SARTrailing_texbook (0); // если бай if (orderType == OP_SELL) SARTrailing_texbook (1); // если селл }
Внешние переменные
extern string Trailing = "---------- Параметры трала"; extern int UseTrailing = 0; // 0/1 - Использовать трал extern int type = 7; // вид трала - возможные значения: 0 - простой, 1 - по фракталам, 2 - по теням N свечей, 3 - по 2-м АТР, // 4 - по ценовому каналу, 5 - по МА, 6 - половинящий, 7 - по SAR. extern bool trlinloss = false; // Тралим только профит для всех видов тралов extern string A5 = "Параметры простого трала,пo фракталам,теням N баров,каналу,МА,SAR"; extern int TralingStop = 1000; // дистанция простого трала в положительной зоне (пункты) extern int indent = 100; // отступ (пунктов) при трале по фракталам, теням N свечей, ценовому каналу, МА,SAR extern int bars_n = 10; // количество баров, для трала по их теням (от 1 и больше) или расчета границ канала extern int Period_MA_tral = 9; // для трала по МА extern double Step = 0.02; // SAR extern double Maximum = 0.2;
Написан по аналагии учебнику - здесь. Сам пока его (ИМЕННО ЭТОТ ТИП ТРАЛА) здесь (в такой конструкции) не юзал, но должен работать исправно.
double SL0=iSAR(NULL,TFT,XT,YT,0)-Spread*Point;
Смелое решение. Неординарное.
Смесь домашних тапочек с до мажором.
Жизнь будет гораздо проще, если трал писать в категориях цены, а не значений индикатора.
Надо так
Вызов этой ф-ии из СТАРТА эксперта
Внешние переменные
Написан по аналагии учебнику - здесь. Сам пока его (ИМЕННО ЭТОТ ТИП ТРАЛА) не юзал, но должен работать исправно.
Ты проблемы не понял... Трал по сару у меня работыет исправно!!!! проблема в том что я не могу сделать так что бы трал не выстовлял лося меньше чем уже стоит, то есть обратно что бы стопы не двигал!!!!
Ты проблемы не понял... Трал по сару у меня работыет исправно!!!! проблема в том что я не могу сделать так что бы трал не выстовлял лося меньше чем уже стоит, то есть обратно что бы стопы не двигал!!!!
Смотри, как у меня организован код при бае и селле и ставь по аналогии его к себе в код и все - " то есть обратно что бы стопы не двигал!!!!
" - обратно двигать не будет.
Переноси к себе условия, например, для бая
if (( ( (prev_Sar - (indent+ MarketInfo(Symbol(),MODE_SPREAD))*Point) > NormalizeDouble(SL,Digits)) || (NormalizeDouble(SL,Digits)==0)) && (prev_Sar - (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point < Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) && prev_Sar < Bid && NormalizeDouble(Price,Digits) < NormalizeDouble(prev_Sar - (indent+ MarketInfo(Symbol(),MODE_SPREAD))*Point,Digits)) // Если ниже желаемого и в профите { // то модифицируем его SL = prev_Sar - (indent+ MarketInfo(Symbol(),MODE_SPREAD))*Point; // Новый его StopLoss Modify=true; // Назначен к модифи. }
Смелое решение. Неординарное.
Смесь домашних тапочек с до мажором.
Жизнь будет гораздо проще, если трал писать в категориях цены, а не значений индикатора.
Что тебя удивило, не понял? TFT,XT,YT, Spread - переменные. Не понимаю что ты имеешь ввиду по поводу категории цен???
Смотри, как у меня организован код при бае и селле и ставь по аналогии его к себе в код и все.
Может человек понять хочет.
void TralBuy() { double SL0 = iSAR(NULL,TFT,XT,YT,0) - Spread*Point; if(LastBar1 != iTime(NULL,TFT,0) && SL0 > OrderStopLoss()) { bool Ans0 = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(SL0,Digits),OrderTakeProfit(),0); LastBar1 = iTime(NULL,TFT,0); if(Ans0 == false) Alert("Case1,Ордер ",OrderTicket()," не модифицирован"); } }
мне кажется что ордер выбрать нужно, а то условия выполняются, а какой ордер модифицируется - ХЗ
ps я не вникаю откуда берется SL0, но если SL0 > OrderStopLoss() уровень должен лезть вверх
Может человек понять хочет.
Из кода этого не понять, т.к. это лишь сама ф-ия модифи ордера, мош он до нее уже выбрал ордер - а так скорей всего и есть, т.к. он пишет, что модифи работает, но не правильно, а это из-за того, что не в полном объеме прописаны необходимые и достаточные условия для трала выбранного ордера! Так и есть. Я ему привел ВЕРНЫЕ условия для трала, чтобы в обратку трал не работал - но работал строго в сторону открытого ордера.
Ордер выбран до этого! с этим тоже проблемы нет
Почему советник игнорирует эту запись SL0 > OrderStopLoss()? где SL0 новый стоп лосс
Если ордер выбран - тикет передайте в функцию. И другие параметры, как OrderStopLoss()
Ордер выбран до этого! с этим тоже проблемы нет
Почему советник игнорирует эту запись SL0 > OrderStopLoss()? где SL0 новый стоп лосс
Вы одно поймите, что у Вас не исключено здесь МНОГОЕ не верно - отойдите от своего кода - берите грамотно написанный код из библиотеки трайлинг-стопов от Юрия Дзюбана и правите подобную ф-ию под Ваш параболик сар, например меняете трал по МА или ценовому каналу - подход тот же, код грамотный - все работает - что еще Вам надо??? Зачем изобретать велосипед, натыкаясь на одни и те же грабли, когда все уже давно украдено до Вас (с)...
Берете, правите, пользуетесь - в прицепе - библиотека тралов + описание.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Вообщем не понимаю или я идиот, или ерунда какая то или проблема тестера....
Вообщем пишу я трал в советник, где в один момент трал выставляет сделку в безубыток, и потом снова тралит по старому критерию (по iSAR) как только значение нового стопа будет больше чем уже выставленный в беззубыток стоп. А если более обширно то нужно просто что бы трал не менял лося если новый меньше чем уже стоящий (больше меньше при покупке, больше при продаже). У меня же трал в нужный момент выставляет лося в беззубыток, и тут же или через какое то время меняет его на более маленький, эт при покупке. Дело происходит в тестере. Подскажи те что неправельно делаю. А пишу я это дело так: