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

 

Ладно. Не будем может. Похоже мы оба не обладаем достаточными знаниями. Автор вопроса спрашивал как изменить СтопЛосс. Думаю, что он не будет вникать в глубины.

А Вы всё-таки попробуйте присваивать после функтции OrderSend

 
MaxZ:

Что это за цифра "12" в функции OrderSend? :(

И Вы Меня не правильно поняли по поводу выбора ордеров... Надо так:

Привет!

Огромное спасибо! за ответы!!!

я, наверное, не правильно выразился: идея такова:

заключается сделка сэлл при 1.4545.. цена уходит против тренда - 1.4585.. и ТУТ - должен выставляться отложенный ордер на 1.4565.

мой код работает не корректно:

void otlogka (int order)
{  
   int a, k=OrdersTotal();
   for (a=k-1; a>=0; a--){
         if (OrderSelect(a, SELECT_BY_POS, MODE_TRADES)){
            if (OrderType()==OP_BUY){
               if (Bid*Point-OrderOpenPrice()>40)
               RefreshRates();
               if (k>1){
                  {
                     order=OrderSend(Symbol(),OP_SELLLIMIT,0.02,OrderOpenPrice()+20*Point,1,SL,0,"Otlogka",mn,5,0);
                  }}}}}
    
           if (OrderType()==OP_SELL){
               if (Ask*Point-OrderOpenPrice()<40)
                  RefreshRates();
                  if (k>1){
                {
                  order=OrderSend(Symbol(),OP_BUYLIMIT,0.02,OrderOpenPrice()-20*Point,1,SL,0,"Otlogka",mn,5,0);
                }}}

}

Прошу помощи!!!

 
FOReignEXchange:

Я же сказал, что пока будет выполняться функция OrderSend цена может поменяться. Поэтому присваивать надо после, когда она уже поменялась.

Можно и так:

if (Opn_B)
{
   Alert("Попытка открыть ордер Buy...");
   RefreshRates();
   Ticket = OrderSend(Symb, OP_BUY , Lots, Ask, Slippage, 0, 0, NULL, MAGIC, 0, Blue);
   if (Ticket > 0)
   {
      if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))
      if (OrderCloseTime() == 0)
      {
         Alert("Открыт ордер Buy ", Ticket, ".");
         Opn_B = False;
         SL = OrderOpenPrice()-StopLoss*Point;
         TP = OrderOpenPrice()+TakeProfit*Point;
         
         Alert("Попытка модифицировать ордер Buy ", Ticket, "...");
         if (OrderModify(Ticket, OrderOpenPrice(), SL, TP, 0, Blue))
            Alert("Ордер Buy ", Ticket, " модифицирован.");
         else
            Alert("Ошибка: ", GetLastError());
      }
      else
         Alert("Да ну нафиг!?");
   }
   else
      Alert("Ошибка: ", GetLastError());
}
В каждом подходе есть свои плюсы и свои минусы.
 
smartemiy:

Привет!

Огромное спасибо! за ответы!!!

я, наверное, не правильно выразился: идея такова:

заключается сделка сэлл при 1.4545.. цена уходит против тренда - 1.4585.. и ТУТ - должен выставляться отложенный ордер на 1.4565.

мой код работает не корректно:

Прошу помощи!!!

Bid и Ask не нужно умножать на Point. Сразу бросилось в глаза...

Условия должны быть построены иначе:

if (Bid-OrderOpenPrice() > 40*Point)
{...}
if (OrderOpenPrice()-Ask > 40*Point)
{...}

А ещё Мне не ясно что за переменная у Вас SL? Какое значение она имеет? Где рассчитывается?

А вот это

           if (OrderType()==OP_SELL){
               if (Ask*Point-OrderOpenPrice()<40)
                  RefreshRates();
                  if (k>1){
                {
                  order=OrderSend(Symbol(),OP_BUYLIMIT,0.02,OrderOpenPrice()-20*Point,1,SL,0,"Otlogka",mn,5,0);
                }}}

нужно заключить в цикл... Цикл с перебором ордеров должен быть общим для BUY- и SELL-ордеров.

Что-то у Вас совсем плохо с программированием... Советую перечитать ещё раз учебник и разобрать примеры, которые в нём приводятся по написанию простого советника, учёту ордеров и торговым функциям.


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

 
MaxZ:

Bid и Ask не нужно умножать на Point. Сразу бросилось в глаза...

Условия должны быть построены иначе:


А скобки разве не надо ставить?

if ((Bid-OrderOpenPrice()) > 40*Point)
{...}
if ((Ask-OrderOpenPrice()) < 40*Point)
 
MaxZ:

Bid и Ask не нужно умножать на Point. Сразу бросилось в глаза...

Условия должны быть построены иначе:

А ещё Мне не ясно что за переменная у Вас SL? Какое значение она имеет? Где рассчитывается?

А вот это

нужно внести в цикл...

Что-то у Вас совсем плохо с программированием... Советую перечитать ещё раз учебник и разобрать примеры, которые в нём приводятся по написанию простого советника, учёту ордеров и торговым функциям.

Это обычной Stop Loss = SL
 
FOReignEXchange:


А скобки разве не надо ставить?

Не обязательно. И без скобок будет работать! :)

Кому как удобнее. Почерк! :D

 
smartemiy:
Это обычной Stop Loss = SL
А как он рассчитывается? И почему он общий для BUY и SELL?

smartemiy:

заключается сделка сэлл при 1.4545.. цена уходит против тренда - 1.4585.. и ТУТ - должен выставляться отложенный ордер на 1.4565.

Кстати, если против тренда, то условия должны быть наоборот, минусовые:

if (Bid-OrderOpenPrice() < -40*Point)
{...}
if (OrderOpenPrice()-Ask < -40*Point)
{...}

Обычно из выражений

ProfitBUY  = Bid-OrderOpenPrice();
ProfitSELL = OrderOpenPrice()-Ask;

Мы можем найти профит по соответствующей сделке в пипсах. Если профит отрицательный, то это уже убыток. Вот Мы и проверяем, если убыток больше 40 пипс, то нужно выставить отложенный ордер.

 
MaxZ:
А как он рассчитывается? И почему он общий для BUY и SELL?

Stop loss не так важен, сейчас..

код, по теории, будет работать?? с учетом Ваших поправок

 
smartemiy:

Stop loss не так важен, сейчас..

код, по теории, будет работать?? с учетом Ваших поправок

Возможно и будет работать, но корректно ли...

Опять же из Вашей задачи:

smartemiy:

"заключается сделка сэлл при 1.4545.. цена уходит против тренда - 1.4585.. и ТУТ - должен выставляться отложенный ордер на 1.4565."

Открыт ордер SELL. OrderOpenPrice() вернёт значение 1.4545.

Цена уходит против тренда. Ask = 1.4585. Условие:

if (OrderOpenPrice()-Ask <= -40*Point)

сработает (поставил знак "<=").

Проанализируем следующий код:

order=OrderSend(Symbol(),OP_BUYLIMIT,0.02,OrderOpenPrice()-20*Point,1,SL,0,"Otlogka",mn,5,0);

Отложенный ордер BUYLIMIT выставится на цене 1.4545-20*Point = 1.4525... А надо 1.4565.


Но перед этим всем, попробуйте переписать весь код заново. Очень много ошибок, а некоторые места написаны так, как будто Вы не понимаете того, что пишете.

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