Пытаюсь задать разницу между двуми линиями индикатора, но все тщетно!!!

 

Всем доброго времени суток!

Уважаемые программеры, у меня возникли проблемы при реализации следующей идеи:

- имеется индикатор стохастик, при пересечении его линий должен поступать сигнал на продажу или покупку, но при этом должна учитываться разница между его линиями (Diff=1,5, то есть не быть меньше 1,5). Сигнал поступает при появлении первой свечи

   ...
   extern double Diff=1.5;
   ...
   st1=iStochastic(NULL,0,St_K,St_D,St_S,MODE_SMA,1,MODE_MAIN,1);
   st2=iStochastic(NULL,0,St_K,St_D,St_S,MODE_SMA,1,MODE_MAIN,2);
   st3=iStochastic(NULL,0,St_K,St_D,St_S,MODE_SMA,1,MODE_SIGNAL,1);
   st4=iStochastic(NULL,0,St_K,St_D,St_S,MODE_SMA,1,MODE_SIGNAL,2);
   
   RefreshRates();
   New_bar=0; 
   if (Time_0!=Time[0]) 
      {
       New_bar=1;
       Time_0=Time[0];
      }
   if (New_bar==1 && st2<st4 && st1>st3)
      if ((st1-st3)>Diff)
         Opn_B=true;
   if (New_bar==1 && st2>st4 && st1<st3)
      if ((st3-st1)>Diff)
         Opn_S=true;

все st - double; происходит следующее - позиции открываются по пересечению, а разницу как-будто не замечает;

- вторая проблема это возникновение вот такой ошибки:



        2009.06.25 15:46:31 2009.04.20 16:18 StohSig(3) GBPUSD,H1: invalid ticket for OrderModify function

        2009.06.25 15:46:12 2009.04.01 21:04 StohSig(3) GBPUSD,H1: OrderModify error 4051

, но при этом все открывается и работает, правда иногда не модифицирует ордера как планировалось (то есть цена доходит, но модификация не происходит);



Блок модификации образующий эту ошибку:



double TS=Lewel;
int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);
if (TS<Min_Dist)
TS=Min_Dist;

if (Tip==0)//тип buy    //!!!Убрать ошибку 4051 возникающую в этом блоке "...ticket...OrderModify"
   if (SL<Price)
      if ((Bid-Price)>=(TS*Point))
         {
          SL=Price;
          OrderModify(Ticket,Price,SL,TP,0);
         }
   if (SL==Price)
      if ((Bid-Price)>=((TS*2)*Point))
         {
          SL=Price+TS*Point;
          OrderModify(Ticket,Price,SL,TP,0);
         }
   if (Lewel_3rd==true)
      if (SL>Price)
         if ((Bid-Price)>=((TS*2)+(TS/2))*Point)
            {
             SL=Price+(TS*2)*Point;
             OrderModify(Ticket,Price,SL,TP,0);
            }
if (Tip==1)//тип sell
   if (SL>Price)
      if ((Price-Ask)>=(TS*Point))
         {
          SL=Price;
          OrderModify(Ticket,Price,SL,TP,0);
         }
   if (SL==Price)
      if ((Price-Ask)>=((TS*2)*Point))
         {
          SL=Price-TS*Point;
          OrderModify(Ticket,Price,SL,TP,0);
         }
   if (Lewel_3rd==true)
      if (SL==Price)
         if ((Price-Ask)>((TS*2)+(TS/2))*Point)
            {
             SL=Price-(TS*2)*Point;
             OrderModify(Ticket,Price,SL,TP,0);
            }

Lewel - это уровень отклонения цены

Выбираются ордера с помощью OrderSelect - SELECT_BY_POS,MODE_TRADES

ПОЖАЛУЙСТА, подскажите где я ошибаюсь!

 
НАРОД ПОМОГИТЕ РАЗОБРАТЬСЯ, А ЕСЛИ ЭТО УЖЕ ГДЕ-ТО РАЗБИРАЛОСЬ, ТО УКАЖИТЕ МЕСТО
 

А где идёт выбор позиции? Тут не показано. Попробуйте в каждом блоке сделать так 

   if (SL<Price)
      if ((Bid-Price)>=(TS*Point))
         {
          SL=Price;
          if (OrderSelect(Ticket,SELECT_BY_TICKET)=true) OrderModify(Ticket,Price,SL,TP,0,0);
         }
 
WindSW писал(а) >>
НАРОД ПОМОГИТЕ РАЗОБРАТЬСЯ, А ЕСЛИ ЭТО УЖЕ ГДЕ-ТО РАЗБИРАЛОСЬ, ТО УКАЖИТЕ МЕСТО

по 1 вопросу-

Попробуйте код написать примерно так:

New_bar=false;
   if(Time_0!=Time[0]){New_bar=true; Time_0=Time[0];}

   if(New_bar){
      if(st2<st4){
         if(st1>st3){
            if((st1-st3)>Diff){
                Opn_B=true;
      }}}
      if(st2>st4){
         if(st1<st3){
            if((st3-st1)>Diff){
               Opn_S=true;
      }}}                
   }

по 2 вопросу -

Раз пишет - "invalid ticket for OrderModify function"

значит где то в процессе теряется тикет, попробуйте его явно контролировать или

перед использованием функции выбирать ордер при помощи

bool OrderSelect( int index, int select, int pool=MODE_TRADES) 

 
OrderModify ERR_CUSTOM_INDICATOR_ERROR (4055), ERR_INTEGER_PARAMETER_EXPECTED (4063), ERR_INVALID_FUNCTION_PARAMVALUE (4051), ERR_INVALID_PRICE_PARAM (4107), ERR_INVALID_TICKET (4108), ERR_UNKNOWN_SYMBOL (4106), ERR_TRADE_NOT_ALLOWED (4109), коды от торгового сервера
 

Всем спасибо за участие, буду пробовать на основании ваших поправок. По результату отпишусь

 

Вы все оказались правы по поводу определения конкретного ордера.

Сделал так

   if (SL<Price)
      if ((Bid-Price)>=(TS*Point))
         {
          SL=Price;
          if (OrderSelect(Ticket,SELECT_BY_TICKET)=true) OrderModify(Ticket,Price,SL,TP,0,0);
         }

, как и советовали. Ошибка 4051 действительно пропала, но появилась безобидная ошибка 1 :) Как мне теперь от нее избавиться?

Кстати, после изчезновения ошибки 4051, которая перла без остановки, исчезла проблема с разницей между линиями индикатора!!! Код сразу стал работоспособный!!!

Но все таки, как теперь искоренить ошибку 1? Пишет следующее: 2009.06.25 23:20:41 2009.06.19 14:39 StohSig(4) GBPUSD,H1: OrderModify error 1 и так каждую секунду, но все выполняет как надо

Правка: хотя некоторые ордера не всегда модифицирует!

 
WindSW >>:

Но все таки, как теперь искоренить ошибку 1? Пишет следующее: 2009.06.25 23:20:41 2009.06.19 14:39 StohSig(4) GBPUSD,H1: OrderModify error 1 и так каждую секунду, но все выполняет как надо

1 "Нет ошибки, но результат неизвестен" те OrderModify почему то не возвращает результат операции.

Ни помню у кого рванул библиотеку ошибок на русском, автар отзовись(прилогаю).

Файлы:
error.mq4  7 kb
 
Urain >>:

1 "Нет ошибки, но результат неизвестен" те OrderModify почему то не возвращает результат операции.

Ни помню у кого рванул библиотеку ошибок на русском, автар отзовись(прилогаю).

Спасибо за обработчик ошибок, но я уже применяю подобный. Именно он и подсказал об ошибке 1, но он не указывает как от нее избавиться :)

 

ERR_NO_RESULT 1 OrderModify пытается изменить уже установленные значения такими же значениями. Необходимо изменить одно или несколько значений и повторить попытку. 

Судя по всему при модификации изменяется только стоп, а профит остаётся неизменным. Попробуйте изменять профит хотябы на 1 пункт каждый раз. 

if (OrderSelect(Ticket,SELECT_BY_TICKET)=true) OrderModify(Ticket,OrderOpenPrice(),SL,TP,0,0);

...

if (OrderSelect(Ticket,SELECT_BY_TICKET)=true) OrderModify(Ticket,OrderOpenPrice(),SL,TP+10*Point,0,0);

...

if (OrderSelect(Ticket,SELECT_BY_TICKET)=true) OrderModify(Ticket,OrderOpenPrice(),SL,TP+20*Point,0,0);



И т д.

 Насчёт одного пункта не знаю - получится ли. Попробуйте сначала 10, а потом 1, если всё нормально будет.

 

Иставьте всегда OrderOpenPrice() вместо Price.  Иначе получается так, что Вы пытаетесь изменить Цену открытия вроде как. 

Вобщем поэксперементируйте сначала с ценой открытия, а потом с профитом. Я сам больно-то не грамотен до таких тонкостей. Удачи.

Причина обращения: