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

 
FOReignEXchange:


Кому как нравится. У всех разный почерк. Может быть у Вас всё ти правильно, но мне кажется это коряво.

Я бы так не стал делать.

Во-первых, не совсем понимаю зачем нужно объявлять переменуую там и какой в этом смысл мне тоже не понятно.

Во-вторых, строчка PriceBuy = Ask; находится сразу за функцией OrderSend. И, насколько я понимаю, как только заканчивается выполнение этой функции, вычисления передаются сразу на следующую строчку. Не думаю, что цена Ask может изменится. Я стараюсь писать всё как можно проще, сокращая, кол-во символов, если это не мешает нормальному функционированию программы. Можно присвовить значение также как и у Вас, не вижу тут проблеммы. Написал, что первое и простое пришло в голову.

Я тут как-то написал Пипсовщика и принял участие в конкурсе, в котором минимальный профит, который будет засчитан равен 5 пунктам. Выставил в советнике TP=5, SL=10, кинул советника на график и пошёл гулять. Вечером вернулся домой, заглянул в терминал и был разочарован. Мой пипсовщик закрыл большинство сделок в плюс, но профит по некоторым из них составил 4 пункта и даже 3, а не 5, которые Мне требовалось. Кстати, а SL при этом был иногда не 10, а 11 или 12 пунктов...

Почему? Уверен, ответ Вы знаете! :D

Вот реальная жизненная ситуация, в которой Я перестал считать цены Ask и Bid, за цены открытия ордеров. Если для Вас 1-2 пункта, это не существенно, то ладно. Для Меня бывают существенны эти мелочи...

 
MaxZ:

Почему? Уверен, ответ Вы знаете! :D

Не. Я первое подумал это из-за того, что не был учитан спред.

А были ли сделки, где профит составил 6-7 пунктов?

 
FOReignEXchange:
Не. Я первое подумал это из-за того, что не был учитан спред.

Блин... Цитирую Себя же:

MaxZ:

В-третьих: если в торговой функции OrderSend указан Slippage и Мы хотим открыть ордер Buy, то не обязательно, что ордер откроется именно по цене Ask, так как на исполнение торгового приказа, отданного функцией OrderSend, уходит определённое время и цена может уйти от данного значения.

А к какому значению цены Мы привязываем TP и SL?? К Ask... Цена поменялась, а уровни TP и SL то никуда не сдвинулись.

 
MaxZ:

А к какому значению цены Мы привязываем TP и SL?? К Ask... Цена поменялась, а уровни TP и SL то никуда не сдвинулись.

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

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

 

Было:

if (Opn_B)
{
   Alert("Попытка открыть ордер Buy...");
   RefreshRates();
   SL = Ask-StopLoss*Point;
   TP = Ask+TakeProfit*Point;
   Ticket = OrderSend(Symb, OP_BUY , Lots, Ask, Slippage, SL, TP, NULL, MAGIC, 0, Blue);
   if (Ticket > 0)
   {
      Alert("Открыт ордер Buy ", Ticket, ".");
      Opn_B = False;
   }
   else
      Alert("Ошибка: ", GetLastError());
}

Стало:

if (Opn_B)
{
   Alert("Попытка открыть ордер Buy...");
   RefreshRates();
   SL = Ask-StopLoss*Point;
   TP = Ask+TakeProfit*Point;
   Ticket = OrderSend(Symb, OP_BUY , Lots, Ask, Slippage, SL, TP, NULL, MAGIC, 0, Blue);
   if (Ticket > 0)
   {
      if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))
      if (OrderCloseTime() == 0)
      {
         Alert("Открыт ордер Buy ", Ticket, ".");
         Opn_B = False;
         
         if (NormalizeDouble(OrderOpenPrice()-OrderStopLoss(), Digits) != NormalizeDouble(StopLoss*Point, Digits))
         {
            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());
}

Принцип таков. Но на самом деле всё чуть сложнее...

Как много строчек?? Правда? :)))

 
MaxZ:

Было:

Стало:

Принцип таков. Но на самом деле всё чуть сложнее...

Как много строчек?? Правда? :)))


??? Не понял. А где SL и TP в первом примере?
 
FOReignEXchange:

??? Не понял. А где SL и TP в первом примере?

Я показал лишь принцип. Ну ладно. Добавил.

MaxZ:

Принцип таков. Но на самом деле всё чуть сложнее...

Если ордер откроется не по заявленной цене, то может возникнуть ошибка при модификации ордера и Мы наткнёмся на те же грабли... Поэтому на самом деле ордер пытаемся модифицировать не единожды при положительном Ticket'е... Просто весь код копировать не охото. Он громоздкий. А принцип изложен.
 
А, вижу. SL и TP стоят до функции OrderSend. Может быть проблемма была в этом?
 
FOReignEXchange:
А, вижу. SL и TP стоят до функции OrderSend. Может быть проблемма была в этом?
Какая может быть в этом проблема? Пока будет рассчитываться SL и TP, цена успеет поменяться?? ;)))
 
MaxZ:
Какая может быть в этом проблема? Пока будет рассчитываться SL и TP, цена успеет поменяться?? ;)))

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