[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 340

 
dyxaa:

люди подскажите как можно закрыть отложенный ордер через н, количество пунктовесли он не сработал?

 

его нельзя закрыть, но можно удалить

 

Рисую в учебных целях индикатор (т.е. учусь) и на смене данных получаю такой результат:


Красная и синяя линии не переходят плавно друг в друга.

Почему такое происходит? и как это обходить?

  for(i = limit; i >= 0; i--) 
    {
     cciTrendNow      = iCCI(NULL, 0, CCIPeriod, PRICE_TYPICAL, i);
     cciTrendPrevious = iCCI(NULL, 0, CCIPeriod, PRICE_TYPICAL, i+1);

     if (cciTrendNow > st && cciTrendPrevious < st)
      {
       TrendUp[i+1] = TrendDown[i+1];
       ArrayInitialize( TrendDown[i+1], 0 ); // Попытался обнулить, чтобы обойти некрасивую отрисовку.
      }

     if (cciTrendNow < st && cciTrendPrevious > st) 
      {
       TrendDown[i+1] = TrendUp[i+1];
       ArrayInitialize( TrendUp[i+1], 0 );   // Попытался обнулить, чтобы обойти некрасивую отрисовку.
      }
    }

Проблема проявляется на этом участке кода. Но как это преодолеть - не смог выяснить или что-то сам придумать. Подскажите пожалуйста.

 
dyxaa:

люди подскажите как можно закрыть отложенный ордер через н, количество пунктов, если он не сработал?

 

Нажать на крестик!
 
artmedia70:

Я ж не говорил о внешних переменных. Я говорил вот о чём.

Представим ситуацию. Необходимо принять решение в соответствии с данными последней открытой позиции. 


Для тестера:

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

Как только новая позиция открывается, тут же складываем нужные нам данные в эти переменные.

Когда приходит сигнал на открытие следующей позиции (например через 20 тестерных минут), нам нужно проверить некие критерии, по которым принимаем решение о данных открываемой позиции. Эти критерии, по условию, зависят от предыдущей открытой позиции. Мы их считываем с переменных (мы ж их сохранили при прошлом открытии) и используем в качестве дополнительных данных для новой позиции.

Когда открываем позицию, сохраняем в переменных новые данные о вновь открытой позиции.


Для реала:

Представим ту же ситуацию, но ... ещё представим, что после открытия прошлой позиции и сохранения её данных в переменных, прошло 10 минут (до открытия следующей ещё 10 минут должно пройти (ну мы так предположили в тестерной ситуации)). И вот в этом промежутке времени советник был перезагружен по каким-либо причинам.

Что после рестарта советника произойдёт с данными о последней открытой позиции, которые хранились в переменных? Их не будет.

Значит где их нужно брать? Правильно - искать. Для того и нужны функции поиска необходимых данных. Поэтому для реала лучше сразу всё находить тогда, когда это нам потребуется, а не хранить в переменных, что действительно гораздо проще и быстрее.


Извиняюсь за поздние пояснения - только в свет вышел ... :))



Благодарю Вас Артём. Логично всё, разумеется. Потому я и учусь писать функциями. Только логика иногда хромает. Вот и спотыкаюсь. Последний раз как решился вопрос методом распринтовки всех данных цикла из одной ф-ции  в другую, я пару дней сделал себе передышку от программирования вообще, чтоб всё утряслось. Теперь буду продолжать!
 
solnce600:

Господа подскажите пожалуйста как при помощи цикла закодировать такой алгоритм.

if   (iLow (Symbol (),0,1)  >   iLow (Symbol (),0,10))                                                          //  если  МИНИМУМ первой свечи > МИНИМУМА десятой свечи

OrderSend(Symbol(),OP_BUY,0.1,Ask,1,Bid-2950*Point,Bid+150*Point,"jfh",123 );    //открыть ордер.

А МНЕ НУЖНО

Если  Low 1  и одновременно  Low 2  и одновременно  Low 3...... .. .и одновременно Low  9 свечи  >   Low 10 свечи (т.е Low свечей с 1 по 9)

                                                                                                                                             //открыть ордер.

Спасибо.

Все-таки, если я правильно услышал Ваш вопрос, то код будет таким:

bool have = true;

for (int i=0; i<10; i++)
  {
   if (Low[i] > Low[10])        // Как вариант:  if ( iLow(Symbol(),0,i) > iLow(Symbol(),0,10) )
    {
     have = false;
     break;
    }
  }

if(have) OrderSend(Symbol(),OP_BUY,0.1,Ask,1,Bid-2950*Point,Bid+150*Point,"jfh",123 );    //открыть ордер.

Но это с подсказки FAQ. Без него не справился бы.

 

Появилась мысль, но как для реала это сделать и как оно будет в реале работать надёжно, я не особо представляю.

Суть такая. Войти в рынок нужно, после помещения совы на график сразу после закрытия бара т.е. на открытии нового. Именно для первого ордера. Дальше, когда ордер закроется по ТП или Стопу, так же открываться ордер на открытии нового бара мгновенно. Как это разумнее сделать?

Я так понимаю, нужно завести переменную. В нём поместить цену открытия текущего бара. И сравнивать это значение с  ценой открытия текущего бара. Если значение переменной не равно значение цены открытия текущего бара с индексом нуль, то открываем ордер.

Это самый оптимальный вариант? 

 
Chiripaha:

Рисую в учебных целях индикатор (т.е. учусь) и на смене данных получаю такой результат:


Красная и синяя линии не переходят плавно друг в друга.

Почему такое происходит? и как это обходить?

Проблема проявляется на этом участке кода. Но как это преодолеть - не смог выяснить или что-то сам придумать. Подскажите пожалуйста.


Фуф!...  Разобрался... : )))

Теперь бы еще со всем остальным разобраться - совсем было бы хорошо. Всем, кто хотел помочь, спасибо! : ))

Открываю еще 2 точно таких же буфера - не рисуются... Что за колдунство... - Ладна, будем учиться и искать. Хотя на "велик" жалко время тратить. Когда же в этом случае новое изобретать?

 
hoz:

Появилась мысль, но как для реала это сделать и как оно будет в реале работать надёжно, я не особо представляю.

Суть такая. Войти в рынок нужно, после помещения совы на график сразу после закрытия бара т.е. на открытии нового. Именно для первого ордера. Дальше, когда ордер закроется по ТП или Стопу, так же открываться ордер на открытии нового бара мгновенно. Как это разумнее сделать?

Я так понимаю, нужно завести переменную. В нём поместить цену открытия текущего бара. И сравнивать это значение с  ценой открытия текущего бара. Если значение переменной не равно значение цены открытия текущего бара с индексом нуль, то открываем ордер.

Это самый оптимальный вариант? 


Если реализовать, то в реале будет работать также надежно, как и на демо. Но не факт, что доходно.

Реализовывать через появление нового бара. Но Вы не сформулировали в какую сторону открывать и при каких условиях эта сторона определяется.

Вам ничего сравнивать не надо - просто при появлении нового бара (исходя из данной Вами вводной) нужно открывать ордер и все.

newBars = iBarShift(Symbol(), PERIOD_H1, lastH1BarTime);    // Это было найдено через поиск на форуме

Если не представляете:

"И опыт - сын ошибок трудных
 И гений - парадоксов друг"         (Александр Сергеевич Вам в помощь)

Нужно делать (писать) сову и экспериментальным методом проверять. - За Вас вряд ли кто-то будет сову писать (бесплатно). Подсказать - одно дело. Но идеи реализовывать (мысли) - это уже не помощь, а работа.

 
borilunad:
Нажать на крестик!

ну точно. гениально просто))) 

я прошу вас помоч) вот выставлю ордер отложенный ну пусть  buy stop к примеру мне нужно чтобы если цена прошла 100 пунктов в низ он удалился можно такое сделать?

 
borilunad:
Нажать на крестик!

ну точно. гениально просто))) 

я прошу вас помоч) вот выставлю ордер отложенный ну пусть  buy stop к примеру мне нужно чтобы если цена прошла 100 пунктов в низ он удалился можно такое сделать?

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