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

Открытие двух позиций по цене закрытия дня. Как???

Добавлено: Пн янв 06, 2014 2:23 pm
fbslim
Здравствуйте!

Подскажите пожалуйста... Вот пытаюсь понять как это реализовать в виде стратегии. Вроде бы всё просто на словах. Нужно просто открыть позиции по цене закрытия дня (бара) на дневном графике.

Можно пример этого куска в стратегии вот просто понять не могу.

Смотрел в примере исходник SMAstrategy но там условия на открытие по данным индикатора.
А как реализовать по барам?

Может есть где-то кусок кода любой с тратегии на подобных условиях. Всё обыскал, в упор не вижу :(

Re: Открытие позиции по цене закрытия дня. Как?

Добавлено: Вт янв 07, 2014 11:43 am
fbslim
Всех с Рождеством! :)

Уже разобрался, с помощью уважаемого автора программы и его урокам - http://www.forextester.com/forum/viewtopic.php?t=1015

Но возникает ещё вопрос. Как заставить советника открывать больше одной позиции сразу? Это технически не возможно разве?

Может я и ошибаюсь, но кажется вот в этом месте загвоздка:

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

if (HourOf(time) = OpenTime) and (OrdersTotal = 0) then
   SendInstantOrder
А именно с OrdersTotal = 0

Если поставить не 0 а 1 например - открываются сразу 10 позиции. Что-то не пойму.
А если мне последовательно нужно открыть 3 ордера, например в разное время дня? Или например ордер на следующий день в ту же сторону, даже если предыдущий ещё не закрыт?

Кто-то может подсказать как это сделать?

Re: Открытие позиции по цене закрытия дня. Как?

Добавлено: Ср янв 08, 2014 6:00 pm
fbslim
Тут есть кто живой? :)

Re: Открытие позиции по цене закрытия дня. Как?

Добавлено: Ср янв 08, 2014 9:05 pm
Terranin
fbslim писал(а):Тут есть кто живой? :)
После Нового Года жизни нет.

Re: Открытие позиции по цене закрытия дня. Как?

Добавлено: Ср янв 08, 2014 9:24 pm
fbslim
Terranin писал(а):
fbslim писал(а):Тут есть кто живой? :)
После Нового Года жизни нет.
Terranin, С Новым Годом Вас и с Рождеством!!! Замечательный Вы изготовили продукт, но пока нехватает мозга чтобы реализовать в нём всё то что мне лично нужно для дальнейшей с ним работы, взаимовыгодной понятно ;)
Если я не смогу это осилить, то тогда это не будет иметь смысла. Вот и спрашиваю, и пытаюсь разобраться. Но продукт отменный на первый взгляд и надеюсь я просто пока не до конца понимаю как с ним работать, т.к. опыта в программировании у меня вообще нет. Вот и пытаюсь научиться.

Видно я один больной на праздниках этим занимаюсь. Но всё же я надеюсь на помощь. И жду ответа... когда там Вы сможете конечно.

Спасибо что откликнулись!

Очень бы хотелось разобраться в вышеобозначенных вопросах.

Re: Открытие двух позиций по цене закрытия дня. Как???

Добавлено: Ср янв 08, 2014 10:06 pm
Terranin
Ордеров можно открывать сколько угодно, в примере было OrdersTotal = 0 как условие чтобы открывать ордер только тогда, когда никаких других ордеров не открыто.

Чтобы понять что начался новый день нужно сохранить дату текущего бара, и если дата нулевого бара изменилась по сравнению с сохраненной - значит начался новый день.

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

var
  tm: TDateTime;    // глобальная переменная

// если время последнего бара не равно сохраненному значению
if time(0) <> tm then
  begin
    // значит новый бар, сохраним его время
    tm := time(0);
    открыть ордер 1
    открыть ордер 2
  end;

Re: Открытие двух позиций по цене закрытия дня. Как???

Добавлено: Чт янв 09, 2014 7:51 pm
fbslim
Terranin писал(а):Ордеров можно открывать сколько угодно, в примере было OrdersTotal = 0 как условие чтобы открывать ордер только тогда, когда никаких других ордеров не открыто.

Чтобы понять что начался новый день нужно сохранить дату текущего бара, и если дата нулевого бара изменилась по сравнению с сохраненной - значит начался новый день.

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

var
  tm: TDateTime;    // глобальная переменная

// если время последнего бара не равно сохраненному значению
if time(0) <> tm then
  begin
    // значит новый бар, сохраним его время
    tm := time(0);
    открыть ордер 1
    открыть ордер 2
  end;
Простите, но я даже скомпилировать с этим кодом не могу. В точке где (0) - пишет что недостаточно аргументов.

Вот Ваш пример простой стратегии из Урока 3:

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

library DemoStrategy.dll;

 uses
   SysUtils, DateUtils, StrategyInterfaceUnit, TechnicalFunctions;

var
   Currency: PChar;
   OpenTime: integer= 00;
   StopLoss: integer = 25;
   TakeProfit: integer = 50;
   LotSize: double = 0.1;

 procedure InitStrategy; stdcall;
 begin
   StrategyShortName('Demo');
   StrategyDescription('Strategy opens orders at 8 a.m.');

   RegOption('Currency', ot_Currency, Currency);
   RegOption('OpenTime', ot_Integer, OpenTime);
   RegOption('StopLoss', ot_Integer, StopLoss);
   RegOption('TakeProfit', ot_Integer, TakeProfit);
   RegOption('LotSize', ot_Double, LotSize); 
   SetOptionDigits('LotSize', 1);
   RegOption('Currency', ot_Currency, Currency);
 end;

 procedure DoneStrategy; stdcall;
 begin
   FreeMem(Currency);
 end;

 procedure ResetStrategy; stdcall;
 begin

 end;

 procedure GetSingleTick; stdcall;
 var
   time: TDateTime;
   OrderHandle: integer;
 begin
   if Symbol <> Currency then
     exit; 

   time := iTime(Symbol, PERIOD_M1, 0);

   if (HourOf(time) = OpenTime) and (OrdersTotal = 0) then
     SendInstantOrder(Symbol, op_Sell, LotSize, Ask + StopLoss*Point, Ask - TakeProfit*Point, '', 0, OrderHandle);
   end;

 exports
   InitStrategy,
   DoneStrategy, 
   ResetStrategy,
   GetSingleTick;

 end.
Как мне вставить этот код сюда чтоб не выскакивала ошибка?

Делал вот так:

procedure GetSingleTick; stdcall;
var
time: TDateTime;
OrderHandle: integer;
tm: TDateTime; // глобальная переменная

begin
if Symbol <> Currency then
exit;

time := iTime(Symbol, PERIOD_M1, 0);

// если время последнего бара не равно сохраненному значению
if time(0) <> tm then
begin
// значит новый бар, сохраним его время
tm := time(0);

SendInstantOrder(Symbol, op_Sell, LotSize, Ask + StopLoss*Point, Ask - TakeProfit*Point, '', 0, OrderHandle);
SendInstantOrder(Symbol, op_Sell, LotSize, Ask + StopLoss*Point, Ask - TakeProfit*Point, '', 0, OrderHandle);
end;
И ещё такой момент.
Допустим если из базового примера убрать условие (OrdersTotal = 0) и оставить только (HourOf(time) = OpenTime), то почему-то открываются сразу аж 73 ордера в одну сторону. Хотя SendInstantOrder был только один.

Не понимаю. Штопор. В мануале не нашёл ответа... :(

Re: Открытие двух позиций по цене закрытия дня. Как???

Добавлено: Пт янв 10, 2014 12:58 am
Terranin
Я думал с нуля писать будете. Там наложилась переменная time в процедуре на функцию time() поэтому компиллятор ругался. Пример я написал ниже. Только непонятно зачем 2 абсолютно одинаковых ордера открывать.
Этот пример будет открывать по 2 ордера на каждую дневную свечу. Если надо дождаться закрытия старых перед открытием следующих то там другая песня.

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

var
  tm: TDateTime; // я ж писал это глобальная а не локальная переменная

procedure GetSingleTick; stdcall;
var
  OrderHandle: integer;
begin
  if Symbol <> Currency then
    exit;

  // работаем по заданной валюте на таймфрейме 1 день
  // необходимо вызывать эту процедуру без нее не работают функции Open, Low, High ..., Time
  SetCurrencyAndTimeframe(Currency, 60*24);

  // без этой проверки ордера откроются сразу на первом тике первого бара 
  // а так дождемся формирования первого бара (регулируя это число можно начать работать например с 10го бара)
  if Bars < 2 then 
    exit;

  // если время последнего бара не равно сохраненному значению
  if time(0) <> tm then
    begin
      // значит новый бар, сохраним его время
      tm := time(0);
      SendInstantOrder(Symbol, op_Sell, LotSize, Ask + StopLoss*Point, Ask - TakeProfit*Point, '', 0, OrderHandle);
      SendInstantOrder(Symbol, op_Sell, LotSize, Ask + StopLoss*Point, Ask - TakeProfit*Point, '', 0, OrderHandle);
    end;
end;

Re: Открытие двух позиций по цене закрытия дня. Как???

Добавлено: Пт янв 10, 2014 11:51 am
fbslim
Terranin писал(а):Только непонятно зачем 2 абсолютно одинаковых ордера открывать.
Я просто привёл это в качестве примера. Иногда нужно будет открывать два разных ордера, потом например 2 в одну сторону, один в другую и т.д.
Я был уверен что это достаточно элементарные действия и для них не понадобится никаких новых условий.
А оказалось что на Вашем последнем примере два ордера в одну сторону работают а два в противоположную уже нет...
И это очень грустно и печально. И потрачена куча времени... безрезультатно. И мне за каждым новым действом придётся обращаться к Вам за помощью, а это мягко говоря неудобно ни Вам ни мне.
Очень жаль что всё настолько усложнено для понимания в Вашей чудесной программе. Очевидно что четырьмя уроками и одним примером исходника стратегии тут не обойтись, не на учить. Очевидно надо идти на курсы программеров....
Потому что... разгуляться фантазии нет возможности. Слишком много условий нужно выполнить, которые мне неизвестны. Это нужно досконально знать Делфи, как Вы. Я к сожалению вижу что не тяну. Тут разобраться будет слишком сложно простому обывателю не владеющему языками.
В любом случае, спасибо Вам за попытку научить, но... это слишком сложно и неудобно. Может когда-нибудь я буду мыслить на Делфи как Вы и тогда получится. Но я не программист на сейчас и... не потяну... :(

Придётся искать что-то попроще...

Re: Открытие двух позиций по цене закрытия дня. Как???

Добавлено: Пт янв 10, 2014 3:54 pm
Terranin
fbslim писал(а):
Terranin писал(а):Только непонятно зачем 2 абсолютно одинаковых ордера открывать.
Я просто привёл это в качестве примера. Иногда нужно будет открывать два разных ордера, потом например 2 в одну сторону, один в другую и т.д.
Я был уверен что это достаточно элементарные действия и для них не понадобится никаких новых условий.
А оказалось что на Вашем последнем примере два ордера в одну сторону работают а два в противоположную уже нет...
И это очень грустно и печально. И потрачена куча времени... безрезультатно. И мне за каждым новым действом придётся обращаться к Вам за помощью, а это мягко говоря неудобно ни Вам ни мне.
Очень жаль что всё настолько усложнено для понимания в Вашей чудесной программе. Очевидно что четырьмя уроками и одним примером исходника стратегии тут не обойтись, не на учить. Очевидно надо идти на курсы программеров....
Потому что... разгуляться фантазии нет возможности. Слишком много условий нужно выполнить, которые мне неизвестны. Это нужно досконально знать Делфи, как Вы. Я к сожалению вижу что не тяну. Тут разобраться будет слишком сложно простому обывателю не владеющему языками.
В любом случае, спасибо Вам за попытку научить, но... это слишком сложно и неудобно. Может когда-нибудь я буду мыслить на Делфи как Вы и тогда получится. Но я не программист на сейчас и... не потяну... :(

Придётся искать что-то попроще...
Дельфи тут вроде не при чем, те же самые проблемы возникли бы у Вас и при изучении языка MQL для метатрейдера. Поскольку все функции на 80% совместимы с ним, поэтому если кто-то программировал для метатрейдера без проблем переходит на нашу систему. Но конечно надо уметь программировать или учиться. :) А проще системы не найдете, везде свои языки и свои условия которых Вы не знаете.

PS: Ордер в обратную сторону не выставляется скорее всего потому, что неправильно тейк профит/стоп лосс выставляется (не в том направлении). Попробуйте так:
SendInstantOrder(Currency, op_Buy, LotSize, Ask - point*StopLoss, Ask + point*TakeProfit, 0, '', OrderHandle);
И это тоже не к дельфи относится а к заморочкам рынка.

Re: Открытие двух позиций по цене закрытия дня. Как???

Добавлено: Пт янв 10, 2014 8:09 pm
fbslim
Terranin писал(а):Попробуйте так:
SendInstantOrder(Currency, op_Buy, LotSize, Ask - point*StopLoss, Ask + point*TakeProfit, 0, '', OrderHandle);
И это тоже не к дельфи относится а к заморочкам рынка.
Ошибка после 0,
:(

Это я помню что минус с плюсом надо поменять местами. Почему-то в первый раз не получилось. Теперь вроде да.

Вот так, чуток видоизменив Ваш пример оно заработало:

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

SendInstantOrder(Symbol, op_Buy, LotSize, Ask - point*StopLoss, Ask + point*TakeProfit, '', 0, OrderHandle);
Но это ж нужно догадаться ещё...

И вот ещё кусок:
// необходимо вызывать эту процедуру без нее не работают функции Open, Low, High ..., Time
SetCurrencyAndTimeframe(Currency, 60*24);
Вот в справке я такой информации не нашёл. Как же я могу даже начать догадываться, если никаких входящих данных у меня нет. Только случайные Ваши ответы и наводки на форумах. А все ли это ответы и почему все эти тонкости не изложены в руководстве?!
Возможно Вы правы и 80% переходят с MQL на Вашу платформу без проблем. Возможно в руководстве по MQL все эти тонкости описаны. Я его действительно не читал и не учил MQL. Я просто не вижу КАК наглядно увидеть результат работы своего советника на истории. Только если вывести его на демо счёт.
Тут же всё могло бы быть гораздо быстрее и удобнее но......
Так что... видимо придётся читать справку MQL дабы выяснить какие-то моменты.
Но вообще насколько я знаю, если уж выпускаешь такой замечательный продукт, очень похожий на МетатТрейдер, то почему бы уже не зайти дальше и не написать такое же подробное руководство по программированию на Делфи для конкретно Вашей программы, тем более что всё на 80% одинаково. Я сомневаюсь что кто-то подаст на Вас в суд, т.к. врядли у них есть патент на изобретение интерфейса, в том числе и интерфейса и структуры справочного руководства.

В общем... видимо придётся это всё оставить на время. И собраться с духом для чтения справки MQL :(

Спасибо Вам ещё раз что уделили время. Надеюсь я найду в себе моральные силы в будущем для этой работы...

Re: Открытие двух позиций по цене закрытия дня. Как???

Добавлено: Сб янв 11, 2014 2:51 am
Terranin
fbslim писал(а): Вот в справке я такой информации не нашёл. Как же я могу даже начать догадываться, если никаких входящих данных у меня нет. Только случайные Ваши ответы и наводки на форумах. А все ли это ответы и почему все эти тонкости не изложены в руководстве?!
Возможно Вы правы и 80% переходят с MQL на Вашу платформу без проблем. Возможно в руководстве по MQL все эти тонкости описаны. Я его действительно не читал и не учил MQL. Я просто не вижу КАК наглядно увидеть результат работы своего советника на истории. Только если вывести его на демо счёт.
Тут же всё могло бы быть гораздо быстрее и удобнее но......
Так что... видимо придётся читать справку MQL дабы выяснить какие-то моменты.
Но вообще насколько я знаю, если уж выпускаешь такой замечательный продукт, очень похожий на МетатТрейдер, то почему бы уже не зайти дальше и не написать такое же подробное руководство по программированию на Делфи для конкретно Вашей программы, тем более что всё на 80% одинаково. Я сомневаюсь что кто-то подаст на Вас в суд, т.к. врядли у них есть патент на изобретение интерфейса, в том числе и интерфейса и структуры справочного руководства.

В общем... видимо придётся это всё оставить на время. И собраться с духом для чтения справки MQL :(

Спасибо Вам ещё раз что уделили время. Надеюсь я найду в себе моральные силы в будущем для этой работы...
Надо бы написать, да и хелп обновить, но руки все не доходят. Работы полно, сейчас в разработке третья версия программы. А поскольку основная масса покупателей тестирует стратегии вручную и только некоторые пишут автоматические стратегии основное внимание уделяется разработке новых фич для ручного тестирования. Сделаем как разгребемся с делами.

Re: Открытие двух позиций по цене закрытия дня. Как???

Добавлено: Сб янв 11, 2014 8:35 am
fbslim
Terranin писал(а):Сделаем как разгребемся с делами.
Жду с нетерпением новой версии :!: