Трейлингстоп

Образцы, куски исходников, вопросы. Обсуждаем программирование.
Ответить
Сообщение
Автор
Smile
Сообщения: 27
Зарегистрирован: Вт авг 08, 2006 1:06 pm

Трейлингстоп

#1 Сообщение Smile » Вт сен 05, 2006 11:41 am

Выкладываю процедуру трейлингстопа, проверил, вроде корректно работает:

дописать в uses: дописать в var

Код: Выделить всё

TrailingStop:integer;
TrailingStep:integer;

дописать в Initstrategy

Код: Выделить всё

RegOption('TrailingStop', ot_integer,TrailingStop);
SetOptionRange('TrailingStop',0,100);
TrailingStop:=20;

RegOption('TrailingStep', ot_integer,TrailingStep);
SetOptionRange('TrailingStep',0,100);
TrailingStep:=10;
Сама процедура

Код: Выделить всё

Procedure TS;
var i:integer;
begin
  if OrdersTotal>0 then
  for i:=0  to OrdersTotal do
{1} begin
  OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (OrderType=tp_Buy) then
      begin
      if (OrderStopLoss=0) and (Bid-OrderOpenPrice>TrailingStop*Point) then  ModifyOrder(OrderTicket,OrderOpenPrice,Bid-TrailingStop*Point,0);
      if (OrderStopLoss>0)  and (RoundTo(Bid-TrailingStop*Point,-4)>RoundTo(OrderStopLoss,-4)) then
        begin
        if Bid-OrderStoploss>(TrailingStop+TrailingStep)*Point then   ModifyOrder(OrderTicket,OrderOpenPrice,Bid-TrailingStop*Point,0);
        end;
      end;
      if  (OrderType=tp_Sell) then
      begin
      if (OrderStopLoss=0) and (OrderOpenPrice-Ask>Trailingstop*Point) then   ModifyOrder(OrderTicket,OrderOpenPrice,Ask+TrailingStop*Point,0);
      if (OrderStopLoss>0)  and (RoundTo(Ask+TrailingStop*Point,-4)< RoundTo(OrderStopLoss,-4)) then
        begin
        if (OrderStopLoss-Ask)>(TrailingStop+TrailingStep)*Point then   ModifyOrder(OrderTicket,OrderOpenPrice,Ask+TrailingStop*Point,0);
        end;
      end;
{1} end;
end;
Пользуйтесь :D

mr.Rich
Сообщения: 21
Зарегистрирован: Сб дек 09, 2006 12:56 pm

#2 Сообщение mr.Rich » Вс дек 10, 2006 10:56 am

Всем Привет...

А можно поподробней, где это все нужно прописывать....

VVV
Сообщения: 13
Зарегистрирован: Сб дек 09, 2006 12:50 pm

#3 Сообщение VVV » Ср дек 13, 2006 8:41 am

mr.Rich писал(а):Всем Привет...

А можно поподробней, где это все нужно прописывать....
Присоединяюсь к просьбе :oops:

Smile
Сообщения: 27
Зарегистрирован: Вт авг 08, 2006 1:06 pm

#4 Сообщение Smile » Ср дек 13, 2006 2:01 pm

Значит так, объясняю:
Трейлингстоп выложенный в ветке - это стратегия которая двигает стоплосс. Она пишется на языке Делфи и потом компилируется (CTRL+F9) в DLL файл. Этот файл потом ложим в папку Strategies (у меня C:\Program Files\ForexTester\Strategies).

Выложенную процедуру можно добавить к любой стратегии.
Если же нужен только трейлинг стоп то его можно написать так:

Код: Выделить всё


//--------------------------------------------------------------------------
// Moves stop loss by Smile
//--------------------------------------------------------------------------
library Trailing;

uses
  StrategyInterfaceUnit, Math;

var
  TrailingStop, TrailingStep : integer;

{-----Init strategy----------------------------------------------------------}
procedure InitStrategy; stdcall;
begin
  StrategyShortName('TrailingStop');
  StrategyDescription('Move stop loss');

  RegOption('TrailingStop', ot_integer,TrailingStop);
  SetOptionRange('TrailingStop',0,100);
  TrailingStop:=50;

  RegOption('TrailingStep', ot_integer,TrailingStep);
  SetOptionRange('TrailingStep',0,100);
  TrailingStep:=10;

end;

{-----Done strategy----------------------------------------------------------}
procedure DoneStrategy; stdcall;
begin
  //
end;

{-----Reset strategy---------------------------------------------------------}
procedure ResetStrategy; stdcall;
begin
  //
end;
//===============================================
 Procedure TS; 
var i:integer; 
begin 
  if OrdersTotal>0 then 
  for i:=0  to OrdersTotal do 
{1} begin 
  OrderSelect(i,SELECT_BY_POS,MODE_TRADES); 
      if (OrderType=tp_Buy) then 
      begin 
      if (OrderStopLoss=0) and (Bid-OrderOpenPrice>TrailingStop*Point) then  ModifyOrder(OrderTicket,OrderOpenPrice,Bid-TrailingStop*Point,0); 
      if (OrderStopLoss>0)  and (RoundTo(Bid-TrailingStop*Point,-4)>RoundTo(OrderStopLoss,-4)) then 
        begin 
        if Bid-OrderStoploss>(TrailingStop+TrailingStep)*Point then   ModifyOrder(OrderTicket,OrderOpenPrice,Bid-TrailingStop*Point,0); 
        end; 
      end; 
      if  (OrderType=tp_Sell) then 
      begin 
      if (OrderStopLoss=0) and (OrderOpenPrice-Ask>Trailingstop*Point) then   ModifyOrder(OrderTicket,OrderOpenPrice,Ask+TrailingStop*Point,0); 
      if (OrderStopLoss>0)  and (RoundTo(Ask+TrailingStop*Point,-4)< RoundTo(OrderStopLoss,-4)) then 
        begin 
        if (OrderStopLoss-Ask)>(TrailingStop+TrailingStep)*Point then   ModifyOrder(OrderTicket,OrderOpenPrice,Ask+TrailingStop*Point,0); 
        end; 
      end; 
{1} end; 
end;
//================================================

{-----Process single tick----------------------------------------------------}
procedure GetSingleTick; stdcall;
begin
TS
end;

exports

InitStrategy,
DoneStrategy,
ResetStrategy,
GetSingleTick;

end.

Или вот архивчик с уже готовым трейлингом :lol:
Вложения
Trailing.rar
(50.68 КБ) 1750 скачиваний

arkeo
Сообщения: 1
Зарегистрирован: Вс дек 17, 2006 5:57 am

#5 Сообщение arkeo » Вс дек 17, 2006 6:17 am

Всем привет! У меня такая же проблема не могу в советнике поставить Trailing попробовал по вашим рекомендациям ничего из этого не вышло если можно помогите, как раз это будет наглядным примером. Желательно стоп лосс тейком оставить. Спасибо большое.


ouble Min_Open_Low,Max_Open_High;
int init()
{
Last_Oper = CurTime() - 80;
return(0);
}
int deinit()
{
return(0);
}
int start()
{
int Tmp,Lots = 0;
if(Bars < 100) return(0);
if(LastBars != Bars)
{
LastBars = Bars;
Min_Open_Low = 0;
Max_Open_High = 0;
for(Tmp = 0;Tmp < Bars_Open_Level;Tmp++)
{
if(Max_Open_High < High[Tmp] || Max_Open_High == 0) Max_Open_High = High[Tmp];
if(Min_Open_Low > Low[Tmp] || Min_Open_Low == 0) Min_Open_Low = Low[Tmp];
}
}
if(OrdersTotal() < MaxOrders && Last_Oper + 60 <= CurTime())
{
if(AccountFreeMargin() > 2500) Lots = 2;
else if(AccountFreeMargin() > 1500) Lots = 1;
if(Close[0] > Max_Open_High && Lots != 0)
{
OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid - 100 * Point,Ask + 250 * Point,"",0,0,Green);
Last_Oper = CurTime();
}
if(Close[0] < Min_Open_Low && Lots != 0)
{
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask + 100 * Point,Bid - 250 * Point,"",0,0,Red);
Last_Oper = CurTime();
}
}

Smile
Сообщения: 27
Зарегистрирован: Вт авг 08, 2006 1:06 pm

#6 Сообщение Smile » Чт дек 21, 2006 11:16 am

Эту процедуру можно добавить в любую стратегию для ФОРЕКСТЕСТЕРА!!! В метатрейдере она работать не будет

Тезис
Сообщения: 4
Зарегистрирован: Пт фев 02, 2007 4:22 pm

Re: Трейлингстоп

#7 Сообщение Тезис » Пт фев 02, 2007 4:51 pm

Smile писал(а):Выкладываю процедуру трейлингстопа, проверил, вроде корректно работает:
Заметил в кодах трейлинг-стопов существенную ошибку. Самое странное, что эта ошибка кочует от пользователя к пользователю, из кода в код, и её почему-то не исправляют.
begin
if (Bid-OrderOpenPrice>TrailingStop*Point) then ....
Ну ка протестируем этот кусок кода.
Бид минус цена открытия ордера... больше размера трейлингстопа
что при такой постановке вопроса произойдёт (отвлечёмся пока от термина размер пункта)? Пусть TrailingStop=15, трейлингуемый рыночный ордер типа Buy. Цена его открытия находится на уровне ноль (то есть, примем цену его открытия за нулевой уровень).

Итак, шаг №1 - цена скакнула на 20 пунктов вверх от цены открытия
Ясно что бид минус цена открытия будет = 20 и это больше чем размер трейлинга в пунктах. Куда будет подтянут стоп-лосс?
Bid-TrailingStop*Point
То есть, текущая цена минус размер трала.
Итого, стоп-лосс установится на уровень = +20-15=+5 , то есть, на 5 пунктов выше цены открытия ордера.
Пока вроде всё верно, если бы не злое движение цены в обратном направлении...

Шаг 2 - от отметки в +20 пунктов цена на следующем тике упала на три пункта вниз, то есть, Бид=+17. Что произойдёт в этом случае?
Bid - OrderOpenPrice>TrailingStop...
+17 - 0 > 15
Это условие выполняется - оно истинно, поэтому ордер будет модифицирован и будет установлен стоп-лосс на другом уровне. Вычисляем:
новый уровень стоп-лосса = Bid-TrailingStop...
= + 17 - 15 = +2
Итого стоп-лосс был установлен на уровне +5, а переместился на уровень +2 и это для Buy-ордера!!!
Стоп-лосс встал ниже чем был, а должен был остаться там, куда последний раз был установлен.

Как решить это недоразумение? Я для себя решил его так:

если (Bid-(TrailingStop*Point)>OrderStopLoss) то NewStopLoss=Bid-TrailingStop*Point;
При такой постановке вопроса прога поймёт, что если цена упала, то новый стоп-лосс встанет ниже имеющегося и прога не сделает такую ошибку, то есть, не модифицирует ордер, а вот если уровень нового стоп-лосса больше имеющегося, то стоп-лосс будет подтянут.

Smile
Сообщения: 27
Зарегистрирован: Вт авг 08, 2006 1:06 pm

#8 Сообщение Smile » Пн фев 05, 2007 2:19 pm

Чего-то ты намудрил по-моему.
Если я не ошибаюсь то вот эта строчка избавит от подобных проблем:
if Bid-OrderStoploss>(TrailingStop+TrailingStep)*Point then ModifyOrder(OrderTicket,OrderOpenPrice,Bid-TrailingStop*Point,0);

и она там есть в коде

Gepard
Сообщения: 8
Зарегистрирован: Вс окт 11, 2009 3:13 pm
Откуда: Оттуда

#9 Сообщение Gepard » Вс окт 11, 2009 3:18 pm

Кто может помочь в написании стратегии для FT?

Тезис
Сообщения: 4
Зарегистрирован: Пт фев 02, 2007 4:22 pm

#10 Сообщение Тезис » Пн окт 12, 2009 5:22 am

Gepard писал(а):Кто может помочь в написании стратегии для FT?
Что такое FT?

Тезис
Сообщения: 4
Зарегистрирован: Пт фев 02, 2007 4:22 pm

#11 Сообщение Тезис » Пн окт 12, 2009 5:25 am

Smile, У меня возникли вопросы. Рассмотрим строку из Вашего кода:
if (OrderType=tp_Buy) then
В MQL4 правильным написанием этой строки было бы
if(OrderType()==OP_BUY)
У Вас же стоит OrderType без скобок и вместо OP_BUY стоит tp_Buy, которая ранее в коде ни где не инициализируется значением.
Почему так?

Gepard
Сообщения: 8
Зарегистрирован: Вс окт 11, 2009 3:13 pm
Откуда: Оттуда

#12 Сообщение Gepard » Вт окт 13, 2009 5:21 pm

Форекс Тестер!

Тезис
Сообщения: 4
Зарегистрирован: Пт фев 02, 2007 4:22 pm

#13 Сообщение Тезис » Вт окт 13, 2009 7:33 pm

Gepard писал(а):Форекс Тестер!
Это что, отдельная программа, тестер стратегий в терминале МТ4 или вообще, что подразумевается под Форекс Тестером?

Ответить