Всем здравствуйте!
Перечитал свои старые посты в этой ветке, попытался закодить что мне нужно, но никак не получается.
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');