Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 102

 
Dozol:


Roger, не могу понять!

Бросили горизонтальную линию на график, фиксирую ее цену, линию удаляю- она больше не нужна. Тут же устанавливаем ордер по этой цене.

В чем ошибка? И почему селл стоп не откроется?

зачем и дальше следить ценой, если мне нужно только значение цены горизонтальной линии?

Объясните!!! Help! Поподробней, пожалуйста!

С селлстопом - погорячился, откроется.

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

 
borilunad:
Извини! Тогда быстро на горшок и спать! Спокойного утра! ;)
Ладно. Сам догадаюсь, не такая уж неразрешимая загадка. Но пока только костыли в голову лезут. Костыльный метод - не есть гут метод...
 
Люди добрые, подскажите, что не так. При сделке на продажу, которая открывается на первом тике 0 бара, стоп лосс нужно выставить на 30 пунктов (5 знаков) выше High первой свечи. Написал так, но стоп лосс совсем не ставит.
     Price = NormalizeDouble(Bid, Digits); // округляем до нужного нам числа цифр после запятой
     if(StopLoss > 0)
     if(Bid < iHigh(Symbol(),0,1)) 
     {
       StopLoss = iHigh(Symbol(),0,1)+30*Point;
       SL= Price + StopLoss*Point;
       SL = NormalizeDouble(SL, Digits); // округляем до нужного нам числа цифр после запятой
      }
 
artmedia70:

А на пальцах? Как время и цена могут говорить о закрытии по тейку? Я конечно и сам могу подумать, но у меня уже 7.43 утра, а я ещё не ложился.


Если 7.43 и не ложился.. Значится, предположу, что пишется грааль!
 
alexey1979621:
Люди добрые, подскажите, что не так. При сделке на продажу, которая открывается на первом тике 0 бара, стоп лосс нужно выставить на 30 пунктов (5 знаков) выше High первой свечи. Написал так, но стоп лосс совсем не ставит.

StopLoss = iHigh(Symbol(),0,1)+30*Point;

Это уже и есть нужный Вам уровень стоплосса, например, 1,5000+30*0,00001 = 1,5003


SL= Price + StopLoss*Point; 
Зачем еще к Price добавлять StopLoss*Point (1,5003*0,00001=0,000015). SL становится практически равен Priсe, поэтому и не ставится стоплосс.
 
Стоп лосс все равно не ставится, а тайк профит работает. Код стоп лосса и тейк профита прилагаю
Price = NormalizeDouble(Bid, Digits);  
     if(StopLoss > 0)
     if(Bid < iHigh(Symbol(),0,1)) 
      {
       StopLoss = iHigh(Symbol(),0,1)+30*Point;
       SL = NormalizeDouble(SL, Digits); 
      }
       else SL = 0;
       if(TakeProfit > 0)
      {
       TP = Price - TakeProfit*Point;
       TP = NormalizeDouble(TP, Digits); 
      }
       else TP = 0;
      { 
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP,"Pattern_1",Magic,0,Red);
      return;
      }
 
artmedia70:
1. Ищем последнюю закрытую позицию (MODE_HISTORY).
2. Если она закрыта по тейку (или вблизи него) --> Запоминаем её время открытия -->
3. Перебираем все открытые позиции (MODE_TRADES) и сравниваем их время открытия с запомненным (из п.2) --> Если запомненное время открытия закрытой по тейку позиции (из п.2) самое большое из времени открытия остальных открытых позиций --> Значит по тейку закрыта именно последняя открытая позиция -->
4. Кроем/удаляем нафиг всё остальное.


Хм. Вроде как написал. Но на выходе результат не тот..

Вот что вышло у меня:

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
datetime GetLastOrderState()
{
   datetime lastOrderCloseTime = -1,               // Время закрытия последнего открытого ордера
            lastOOTMarket = -1,          // Время открытия последнего открытого ордера рыночного
            lastOOTHist = -1;            // Время открытия последнего открытого ордера из истории
   
   for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() > 1) continue;               // Все удалённые отложки нас не интересуют..
  
      if (lastOrderCloseTime < OrderCloseTime())   // Находим время закрытия..
          lastOrderCloseTime = OrderCloseTime();   // ..последней закрытой позиции в истории
      
      if (MathAbs(OrderTakeProfit() - OrderOpenPrice()) < i_tp * pt) return(0);
      
      lastOOTHist = OrderOpenTime();   // Тогда время открытия последней закрытой позиции из истории
   }
   
   Comment("Время открытия последнего открытого ордера = ", lastOOTHist);
  
   for (int h=OrdersTotal()-1; i>=0; i--)
   {   
      if (!OrderSelect(h, SELECT_BY_POS, MODE_TRADES)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      {
         if (lastOOTMarket < OrderOpenTime())
             lastOOTMarket = OrderOpenTime();
  
         if (lastOOTMarket < lastOOTHist)      // Если время открытия последнего открытого ордера (рыночного) ниже последнего открытого ордера из истории..
             lastOrderCloseTime = OrderCloseTime(); // Значит это искомый ордер
      }
   }

   Comment("Время закрытия последнего открытого ордера = ", lastOrderCloseTime);
   return (lastOrderCloseTime);
}
 
alexey1979621:
Люди добрые, подскажите, что не так. При сделке на продажу, которая открывается на первом тике 0 бара, стоп лосс нужно выставить на 30 пунктов (5 знаков) выше High первой свечи. Написал так, но стоп лосс совсем не ставит.

У Вас тут вообще абы что. Начнём с того, что закрытие шорта всегда по АСКу, а не по БИДу.
 
alexey1979621:
Стоп лосс все равно не ставится, а тайк профит работает. Код стоп лосса и тейк профита прилагаю

Price = NormalizeDouble(Bid, Digits);  
     if(StopLoss > 0)
     if(Bid < iHigh(Symbol(),0,1))               // Здесь еще STOPLEVEL нужно проверять, иначе частые ошибки будут
      {
       StopLoss = iHigh(Symbol(),0,1)+30*Point;  // Здесь вместо переменной StopLoss попробуйте поставить SL
       SL = NormalizeDouble(SL, Digits); 
      }
       else SL = 0;
       if(TakeProfit > 0)
      {
       TP = Price - TakeProfit*Point;
       TP = NormalizeDouble(TP, Digits); 
      }
       else TP = 0;
      { 
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP,"Pattern_1",Magic,0,Red);
      return;
      }
 
hoz:


Хм. Вроде как написал. Но на выходе результат не тот..

Вот что вышло у меня:

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