Страница 2 из 2

Добавлено: Чт мар 29, 2007 4:08 pm
Mike
Terranin писал(а):
Mike писал(а):Как не парадоксально, но этот кусок в принципе делает что мне надо.
Но твой пример безусловно правильней!
А если подобную вещь замутить с отложенным ордером, т.е код тот же, только вместо рыночного ордера - отложенный. Как установить цену открытия у него вычислимой, т.е что-то аналогичное выделенному:

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

SendInstantOrder(Symbol, op_Buy, 0.1, 0, [b]Ask + TakeProfit*Point[/b], OrderHandle); 
и можно ли так вообще сделать? Для пример: есть какой либо хай(ближайший или самый больший) нужно чтобы цена открытия была Хай + 5 пунктов, как в скальпинге Парамона.

Спасибо.
Можно конечно.

SendPendingOrder(Symbol, op_SellLimit, 0.1, price + StopLoss*Point, price - TakeProfit*Point, price, "", 0, OrderHandle);

price - цена отложенного ордера
Я так и не понял, откуда берется price в данном случае. Попробую объяснить что нужно:
1.У меня есть текущее значение Хая на 9 утра.
2.В 9 утра я хочу выставить отложенный ордер по значению этого Хая или Хая+5 пунктов.
3.Мне нужно как-то передать значение этого Хая -> price.
4.Тогда отложенный ордер будет установлен по этой цене.
Можно ли так сделать и как если можно?

Спасибо

З.Ы. Я тебя наверное достал уже?!

Добавлено: Чт мар 29, 2007 4:25 pm
Terranin
Я так и не понял, откуда берется price в данном случае. Попробую объяснить что нужно:
1.У меня есть текущее значение Хая на 9 утра.
2.В 9 утра я хочу выставить отложенный ордер по значению этого Хая или Хая+5 пунктов.
3.Мне нужно как-то передать значение этого Хая -> price.
4.Тогда отложенный ордер будет установлен по этой цене.
Можно ли так сделать и как если можно?

Спасибо

З.Ы. Я тебя наверное достал уже?!
Чеж тут непонятного? price это цена которую ты сам задаешь. Если нужен хай заменяешь price на High(index) + 5*Point, High(index) это тот хай где ты его нашел. И + 5 поинтов.

Добавлено: Чт мар 29, 2007 5:06 pm
Mike
Немного не так объяснил, то что сам задаешь я знаю. Я просто не знал и не понимал, что вместо price можно написать High.... т.е. как бы не сам задаешь, а прога вычисляеет и устанавливает.

Добавлено: Чт мар 29, 2007 5:24 pm
Terranin
Mike писал(а):Немного не так объяснил, то что сам задаешь я знаю. Я просто не знал и не понимал, что вместо price можно написать High.... т.е. как бы не сам задаешь, а прога вычисляеет и устанавливает.
Все параметры во всех процедурах можно рассчитывать на ходу.

Добавлено: Пн апр 23, 2007 7:34 pm
VVV
Добрый день. Хочу сделать так, что бы можно было задавать/менять индикатор для стратегии из окна параметров (не переделывая каждый раз код).
Пример:
Изображение
Вот такой код получился.


library 2MA;
...

var
ind:integer;
Ma_name, Ma_param:string;

procedure InitStrategy; stdcall;
begin

.......

RegOption('Ma_Name', ot_String, Ma_Name);
Ma_Name := ('MovingAverage');

RegOption('Ma_param', ot_String, Ma_param);
Ma_param := ('30;0;Weighted (WMA);(High + Low)/2');

end;

procedure ResetStrategy; stdcall;
begin

Ind:=CreateIndicator(Currency,TimeFrame,Ma_Name,Ma_param);
end;



Но при смене названия или параметров индикатора выскакивает ошибка:

Изображение[/img]

Что я не так делаю? Параметры и имя индикатора заданы правильно.

Добавлено: Пн апр 23, 2007 7:56 pm
Terranin
Параметры указываются без кавычек так же как и имя индикатора.

Добавлено: Вт апр 24, 2007 5:48 am
VVV
Terranin писал(а):Параметры указываются без кавычек так же как и имя индикатора.
Спасибо. Теперь работает. :)

Re: Возможна ли такая конструкция...

Добавлено: Вс июн 07, 2020 12:30 am
Mike
Всем здравствуйте!
Перечитал свои старые посты в этой ветке, попытался закодить что мне нужно, но никак не получается.
1)Есть котировки дневного графика, нужно по простому условию на бар(1) открыть позицию по цене открытия на бар(0) и закрыть позицию по цене закрытия на бар(0). Т.е. поза держится один день.
2)Есть котировки дневного графика, нужно по простому условию на бар(1) открыть позицию по цене открытия на бар(0) и закрыть позицию по цене закрытия на бар(+1). Т.е. поза держится 2 дня.
Все что у меня получилось "закодить" - это открыть на бар(0), но закрыть только на открытии бар(1), т.е. позиция продержалась до открытия следующего дня, а нужно закрыть по цене закрытия в день открытия. Т.к. завтра может быть гэп, а он мне не нужен.
Открывать позицию можно в любую сторону тут разницы нет купить или продать,(главное закрыть в день открытия), т.к. это просто тест на предмет того, а стоит ли дальше тестить или не стоит. А по условию 2) держать два дня и закрыть по закрытию второго дня.

Может кто-нибудь пример кода написать или мой исправить/подправить?
Для дневного графика такое в ForexTester 4 можно закодить или нужно обязательно на внутридневные котировки переходить? Спасибо.

Мое пример для одного дня, но не совсем правильный:

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

library TSTSTS;

uses
  SysUtils, Classes, StrategyInterfaceUnit, TechnicalFunctions, DateUtils, Math;

var
//Назначение внешних параметров
//Назначение внутренних параметров

  Currency: PChar = nil;
  LotSize: double;

 OrderHandle: integer;

 LastTime: TDateTime;
 WidthChannel: double;

OrderStyle: TTradePositionType;
OpenTime: TDateTime;



 {-----Init strategy----------------------------------------------------------}

 procedure InitStrategy; stdcall;
//Процедура инициализации
 //Описание стратегии
 //Регистрация внешних параметров
 //Создание собственных объектов

begin
  StrategyShortName('AUDUSD');
  StrategyDescription('AUDUSD');

  RegOption('Currency', ot_Currency, Currency);
  ReplaceStr(Currency, 'AUDUSD');

  RegOption('LotSize', ot_Double, LotSize);
  SetOptionDigits('LotSize', 1);
  lotSize := 0.01;

end;

{-----Done strategy----------------------------------------------------------}
procedure DoneStrategy; stdcall;
begin
  FreeMem(Currency);
end;

{-----Reset strategy---------------------------------------------------------}
procedure ResetStrategy; stdcall;
begin
//  OrderHandle := -1;
  LastTime := 0;

end;
{-----Process single tick----------------------------------------------------}
procedure GetSingleTick; stdcall;
//var
//;

begin
  // проверяем нашу валюту
  if Symbol <> Currency then exit;

  // устанавливаем валюту и таймфрейм
  SetCurrencyAndTimeFrame('AUDUSD', PERIOD_D1);

     // если BUY ордер существует, то закрыть ордер
      if (OrderHandle <> -1) and (OrderStyle = tp_Buy) and
      (OpenTime <> Time(0))

    then

  begin
    CloseOrder(OrderHandle);
    OrderHandle := -1;
  end;

// если нет открытых ордеров и ..... то
 if (OrderHandle = -1) and (Open(1) > Close(1)) then
    begin
    SendInstantOrder('AUDUSD', op_Buy, 0.01, 0, 0, '', 0, OrderHandle);

    OrderStyle := tp_Buy;
    OpenTime := Time(0);

     end;

  end;
  exports


InitStrategy,
DoneStrategy,
ResetStrategy,
GetSingleTick;

end.

Например в wealthlab это делается очень просто:

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

if (A>B) then  

if ShortAtMarket(Bar+1, 'SellOpen') then
    begin
   TakePrice := PositionEntryPrice ( LastPosition ) - Take;
   StopPrice := PositionEntryPrice ( LastPosition ) + Loss;

if PriceLow( Bar+1 ) < TakePrice then
        CoverAtLimit( Bar+1 , TakePrice, LastPosition, 'Take Profit' )
        else
if PriceHigh( Bar+1 ) > StopPrice then
        CoverAtStop( Bar+1 , StopPrice, LastPosition, 'Stop Loss' )
        else
        CoverAtClose(Bar+1 , LastPosition, 'BuyClose');

для удержания двух дней - просто добавляем условие:

if PriceLow( Bar+2 ) < TakePrice then
        CoverAtLimit( Bar+2 , TakePrice, LastPosition, 'Take Profit' )
        else
if PriceHigh( Bar+2 ) > StopPrice then
        CoverAtStop( Bar+2 , StopPrice, LastPosition, 'Stop Loss' )
        else
        CoverAtClose(Bar+2 , LastPosition, 'BuyClose');