Ламерский вопрос

Образцы, куски исходников, вопросы. Обсуждаем программирование.
Сообщение
Автор
Komanch
Сообщения: 42
Зарегистрирован: Пн апр 02, 2007 9:04 am
Откуда: Красноярск

Ламерский вопрос

#1 Сообщение Komanch » Пн апр 02, 2007 9:13 am

Доброго времени суток уважаемому автору. Программу использую давно в режиме ручного тестирования. Хочу теперь освоить автоматизацию, в связи с чем у меня вопрос - что такое API, с чем его есть? Если я правильно понимаю, для написания индюков и стратегий необходимо установить Delphi и всё писать в нём, а потом скомпилированную dll куда-то помещать?

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

Re: Ламерский вопрос

#2 Сообщение Terranin » Пн апр 02, 2007 2:42 pm

Komanch писал(а):Доброго времени суток уважаемому автору. Программу использую давно в режиме ручного тестирования. Хочу теперь освоить автоматизацию, в связи с чем у меня вопрос - что такое API, с чем его есть? Если я правильно понимаю, для написания индюков и стратегий необходимо установить Delphi и всё писать в нём, а потом скомпилированную dll куда-то помещать?
API это набор функций для написания индикаторов и советников. На данный мемент доступно АПИ для Delphi и C++ (для С++ пока только АПИ стратегий).

Вобщем это в случае Delphi 2 файла - StrategiesInterfaceUnit.pas и TechnicalFunctions.pas которые Вы подключаете к своему проекту в виде длл и используете. Смотрите примеры в папке Examples после установки программы а также хелп по стратегиям и индикаторам.

Когда сделаете длл ее надо просто скопировать в папку Strategies и перезапустить тестер. Если все ок, Вы увидите новую стратегию в списке стратегий.

Для индикаторов нужно зайти в Файл->Установить новый индикатор и указать на длл индикатора.
Asta la vista
Mike

Komanch
Сообщения: 42
Зарегистрирован: Пн апр 02, 2007 9:04 am
Откуда: Красноярск

Ещё вопрос

#3 Сообщение Komanch » Пн апр 23, 2007 12:57 pm

Доброго времени суток! Вопрос такой у меня. Можно ли в функциях управления ордерами использовать в качестве параметров не переменные, а другие функции. Например, функции доступа к барам. Т. е., будет ли работать так

ModifyOrder(OrderHandle,Close(6),0);

Или надо сделать так

var SL: double;
...
SL:=Close(6);
ModifyOrder(OrderHandle,SL,0);

И ещё вопрос. Функция ModifyOrder и др. становятся доступны только после вызова функции OrderSelect. Так вот, когда OrderSelect необходимо вызывать? Сразу перед, т. е. предыдущей строчкой? Или можно сколько-то раньше? Если да то когда?

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

Re: Ещё вопрос

#4 Сообщение Terranin » Пн апр 23, 2007 3:40 pm

Komanch писал(а):Доброго времени суток! Вопрос такой у меня. Можно ли в функциях управления ордерами использовать в качестве параметров не переменные, а другие функции. Например, функции доступа к барам. Т. е., будет ли работать так

ModifyOrder(OrderHandle,Close(6),0);

Или надо сделать так

var SL: double;
...
SL:=Close(6);
ModifyOrder(OrderHandle,SL,0);

И ещё вопрос. Функция ModifyOrder и др. становятся доступны только после вызова функции OrderSelect. Так вот, когда OrderSelect необходимо вызывать? Сразу перед, т. е. предыдущей строчкой? Или можно сколько-то раньше? Если да то когда?
Будут работать оба варианта, функции можно использовать как параметры процедур.

ModifyOrder не требует вызова OrderSelect поскольку туда передается конкретный OrderHandle. Читайте документацию, если функция требует предварительного вызова OrderSelect там это будет указано.

Вызов OrderSelect требуется перед получением информации об ордере функциями OrderTicket, OrderOpenPrice, OrderClosePrice, OrderStopLoss и т.д. Выбрали ордер и читаем его поля. Поскольку в эти функции хэндл ордера не передается то значит его надо сначала выбрать.
Asta la vista
Mike

Komanch
Сообщения: 42
Зарегистрирован: Пн апр 02, 2007 9:04 am
Откуда: Красноярск

#5 Сообщение Komanch » Вт апр 24, 2007 3:46 am

Ну да, это я попутал, когда печатал, сорри. Я имел в виду функцию OrderStopLoss.
А MagicNumber ордера и его хэндл чем нибудь принципиально отличаются? Как я понял, доступ к информации об ордере может быть и так и так.

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#6 Сообщение Terranin » Вт апр 24, 2007 5:53 am

Komanch писал(а):Ну да, это я попутал, когда печатал, сорри. Я имел в виду функцию OrderStopLoss.
А MagicNumber ордера и его хэндл чем нибудь принципиально отличаются? Как я понял, доступ к информации об ордере может быть и так и так.
Хендл ордера выдается системой при установке ордера и является уникальным. MagicNumber задается самим пользователем и может быть одинаковым для разных ордеров, чтобы например пометить несколько ордров одним и тем же номером например для разных стратегий разным чтобы они не путались с чужими ордерами.
Asta la vista
Mike

Komanch
Сообщения: 42
Зарегистрирован: Пн апр 02, 2007 9:04 am
Откуда: Красноярск

#7 Сообщение Komanch » Вт апр 24, 2007 7:05 am

Понял, спасибо!

Komanch
Сообщения: 42
Зарегистрирован: Пн апр 02, 2007 9:04 am
Откуда: Красноярск

#8 Сообщение Komanch » Ср апр 25, 2007 5:43 am

Доброго времени суток! Такой вопрос у меня - в стратегиях можно использовать индикаторы, подключив их процедурой. А можно ли делать это в своих индикаторах? Т. е., например, я хочу, чтобы индикатор давал мне сигнал если скользящая средняя больше или меньше себя самой сколько-то баров назад. Можно ли не рассчитывать МА в индюке а обратиться к уже существующему?

wellx
Сообщения: 80
Зарегистрирован: Пн окт 23, 2006 9:30 am

#9 Сообщение wellx » Ср апр 25, 2007 11:52 am

Komanch писал(а):Доброго времени суток! Такой вопрос у меня - в стратегиях можно использовать индикаторы, подключив их процедурой. А можно ли делать это в своих индикаторах? Т. е., например, я хочу, чтобы индикатор давал мне сигнал если скользящая средняя больше или меньше себя самой сколько-то баров назад. Можно ли не рассчитывать МА в индюке а обратиться к уже существующему?
Да, терранин, это уже второй ччеловек просит! Может все же как-то...

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#10 Сообщение Terranin » Ср апр 25, 2007 3:01 pm

wellx писал(а):
Komanch писал(а):Доброго времени суток! Такой вопрос у меня - в стратегиях можно использовать индикаторы, подключив их процедурой. А можно ли делать это в своих индикаторах? Т. е., например, я хочу, чтобы индикатор давал мне сигнал если скользящая средняя больше или меньше себя самой сколько-то баров назад. Можно ли не рассчитывать МА в индюке а обратиться к уже существующему?
Да, терранин, это уже второй ччеловек просит! Может все же как-то...
Пока нет времени. Все же это можно пока и обычными средствами обойти, это только леньки... ;)
Asta la vista
Mike

wellx
Сообщения: 80
Зарегистрирован: Пн окт 23, 2006 9:30 am

#11 Сообщение wellx » Чт апр 26, 2007 9:28 am

Terranin писал(а):
wellx писал(а):
Komanch писал(а):Доброго времени суток! Такой вопрос у меня - в стратегиях можно использовать индикаторы, подключив их процедурой. А можно ли делать это в своих индикаторах? Т. е., например, я хочу, чтобы индикатор давал мне сигнал если скользящая средняя больше или меньше себя самой сколько-то баров назад. Можно ли не рассчитывать МА в индюке а обратиться к уже существующему?
Да, терранин, это уже второй ччеловек просит! Может все же как-то...
Пока нет времени. Все же это можно пока и обычными средствами обойти, это только леньки... ;)
Пока да, можно обойтись. Но в теории тут вот какая бяка, если кто-то выложит свой индикатор без исходников или даже с исходниками, но постоянно будет выпускать новые версии, то вместо стабильного кода с вызовом индикатора у себя я буду постоянно иметь проблемы с адоптацией меняющегося кода у себя внутри. Зачем мне этот гимор? Вообще получается уже как бы 3 класса : индикатор, графическая система на базе стандартых автономных индикаторов , стратегии. Вот для граф.систем и нужны вызовы. Это как бы не стратегия в чистом виде.

Komanch
Сообщения: 42
Зарегистрирован: Пн апр 02, 2007 9:04 am
Откуда: Красноярск

#12 Сообщение Komanch » Чт апр 26, 2007 10:09 am

"...это только леньки... " Которые, как известно, двигатель прогресса! :wink:

Komanch
Сообщения: 42
Зарегистрирован: Пн апр 02, 2007 9:04 am
Откуда: Красноярск

#13 Сообщение Komanch » Вс апр 29, 2007 8:56 am

Доброго времени суток.
Пишу такую строчку

if OrderSelect(OrderHandle, SELECT_BY_TICKET, MODE_TRADES) and OrderType = tp_Buy then
begin
...


На этой строке (во втором условии) компилятор выдаёт сообщение

Operator not applicable to this operand type


Где я ошибся? Что к чему неприменимо и как правильно? Я хочу проверить наличие позиции на покупку.

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#14 Сообщение Terranin » Вс апр 29, 2007 2:47 pm

Komanch писал(а):Доброго времени суток.
Пишу такую строчку

if OrderSelect(OrderHandle, SELECT_BY_TICKET, MODE_TRADES) and OrderType = tp_Buy then
begin
...


На этой строке (во втором условии) компилятор выдаёт сообщение

Operator not applicable to this operand type


Где я ошибся? Что к чему неприменимо и как правильно? Я хочу проверить наличие позиции на покупку.
Надо так:
if OrderSelect(OrderHandle, SELECT_BY_TICKET, MODE_TRADES) and (OrderType = tp_Buy) then
Asta la vista
Mike

Komanch
Сообщения: 42
Зарегистрирован: Пн апр 02, 2007 9:04 am
Откуда: Красноярск

#15 Сообщение Komanch » Пн апр 30, 2007 5:13 am

Доброго времени суток.
Никак не могу заставить стратегию делать то, что я хочу :-(.В связи с чем у меня вопрос - какое значение вернёт функция

OrderSelect(OrderHandle, SELECT_BY_TICKET, MODE_TRADES)

если искомая позиция закрыта по стоп-лоссу? Поскольку параметр поиска стоит "MODE_TRADES", то функция должна вернуть значение false, я правильно понимаю?

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#16 Сообщение Terranin » Чт май 17, 2007 2:38 pm

Komanch писал(а):Доброго времени суток.
Никак не могу заставить стратегию делать то, что я хочу :-(.В связи с чем у меня вопрос - какое значение вернёт функция

OrderSelect(OrderHandle, SELECT_BY_TICKET, MODE_TRADES)

если искомая позиция закрыта по стоп-лоссу? Поскольку параметр поиска стоит "MODE_TRADES", то функция должна вернуть значение false, я правильно понимаю?
Да, правильно. Когда ордер закрыт неважно каким образом, вручную или по стоп-лоссу/тейк-профиту ордер переносится из списка открытых позиций в список истории.
Asta la vista
Mike

Komanch
Сообщения: 42
Зарегистрирован: Пн апр 02, 2007 9:04 am
Откуда: Красноярск

#17 Сообщение Komanch » Пн май 21, 2007 1:20 pm

Хм… Сдаётся мне, что у меня функция OrderSelect работает неправильно. (Наверное, опять что-нибудь не так делаю!) Вот кусок моего кода

……..
// Проверка начала дня
if Time(0)<>LastTime then
begin
// Если есть открытая позиция на покупку
if OrderSelect(OrderHandle, SELECT_BY_TICKET, MODE_TRADES) and (OrderType = tp_Buy) then
begin
Breakpoint(1,'buy order is found');
// Условие на подвижку стопа - если с момента открытия прошло DayOfTraling дней или больше,
// и цена закрытия DayOfTraling дней назад больше, чем цена закрытия DayOfTraling+1 дней назад,
// и новый стоп меньше старого меняем старый стоп на новый.
if ((Time(0)-OpenTime) >= (DayOfTraling+1)) and (Close(DayOfTraling+1) > Close(DayOfTraling+2))
and ((Close(1)-Close(DayOfTraling+1)) < OrderStopLoss )
then ModifyOrder(OrderHandle,0,Close(DayOfTraling+1),0);
.…..

Так вот, запускаю тестирование с выполнением стратегии, и прерывание исправно срабатывает в начале каждой свечки. Даже тогда, когда позиция закрыта по стопу. Т. е. значения условия возвращается true?

А вот кусок из лог-файла

…….
2001.06.05 00:00:00 Order #206247 was modified from (EURUSD, sell, lot: 1.00, open at: 0.8829, close at: 0.8462, sl: 0.8651, tp: 0.0000) to (EURUSD, sell, lot: 1.00, open at: 0.8829, close at: 0.8462, sl: 0.8600, tp: 0.0000)
2001.06.06 00:00:00 Order #206247 was modified from (EURUSD, sell, lot: 1.00, open at: 0.8829, close at: 0.8545, sl: 0.8600, tp: 0.0000) to (EURUSD, sell, lot: 1.00, open at: 0.8829, close at: 0.8545, sl: 0.8558, tp: 0.0000)
2001.06.06 08:35:30 Order #206247 (EURUSD, sell, lot: 1.00, open at: 0.8829, close at: 0.8558, sl: 0.8558, tp: 0.0000) was closed by stop loss at price 0.8558. Profit: 271 pips, $2755.00
2001.06.07 00:00:00 Can not modify order #206247
2001.06.07 00:00:00 Reason: Can not find order #206247
2001.06.08 00:00:00 Can not modify order #206247
2001.06.08 00:00:00 Reason: Can not find order #206247
……..

Функция ModifyOrder по идее не должна выполняться, если if OrderSelect вернёт false. А она на каждой свечке пытается передвинуть стоп, не находя, естественно, закрытой уже позиции.
Если я где-то ошибаюсь, то где?
На всякий случай прикрепляю файл с полным исходником стратегии. Надеюсь, что там более-менее понятно…
Вложения
RD4Strategy.zip
(1.94 КБ) 1711 скачиваний

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#18 Сообщение Terranin » Пн май 21, 2007 1:40 pm

Пардон, я тут наврал насчет функции. В целях совместимости с MQL4 функция работает так же как там. Т.е. при поиске по хэндлу ордера она ищет и в открытых позициях и в истории и параметр MODE_TRADES игнорируется. Проверить что ордер закрыт можно функцией OrderClosed.
Asta la vista
Mike

Komanch
Сообщения: 42
Зарегистрирован: Пн апр 02, 2007 9:04 am
Откуда: Красноярск

#19 Сообщение Komanch » Вт май 22, 2007 4:09 am

Ага! :-) Я так и думал... В принципе мне помогла замена на функцию GetOrderInfo, которая работает как положено - если позиция закрыта, то возвращается значение false. Только я не совсем понял, как обращаться с информационной структурой. В частности, как из заполненной структуры получить что-то одно (например, размер стопа), и как привести полученный тип ордера к нормальному виду. В справке есть указание, что это надо сделать, а как не сказано...

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#20 Сообщение Terranin » Ср май 23, 2007 4:30 pm

Komanch писал(а):Ага! :-) Я так и думал... В принципе мне помогла замена на функцию GetOrderInfo, которая работает как положено - если позиция закрыта, то возвращается значение false. Только я не совсем понял, как обращаться с информационной структурой. В частности, как из заполненной структуры получить что-то одно (например, размер стопа), и как привести полученный тип ордера к нормальному виду. В справке есть указание, что это надо сделать, а как не сказано...
Ну как, очень просто. В функцию передается структура а получается заполненная.

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

var
  info: info: TTradePosition;

  GetOrderInfo(OrderHandle, info);
  if info.StopLoss = 0 then ...
Привести тип тоже не проблема:

if TTradePositionType(info.PosType) <> tp_Buy then ...
Asta la vista
Mike

Komanch
Сообщения: 42
Зарегистрирован: Пн апр 02, 2007 9:04 am
Откуда: Красноярск

#21 Сообщение Komanch » Чт май 24, 2007 6:24 am

"Ну как, очень просто." Terranin, делай скидку на то, что далеко не все знают Delphi так же хорошо как ты! :( Я например. Вот ты пример написал, теперь понятно, что нужно написать имя структуры, точку, имя значения, которое хочешь получить. Сенкс :) .

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#22 Сообщение Terranin » Чт май 24, 2007 2:53 pm

;)
Asta la vista
Mike

Komanch
Сообщения: 42
Зарегистрирован: Пн апр 02, 2007 9:04 am
Откуда: Красноярск

#23 Сообщение Komanch » Пт май 25, 2007 7:37 am

Ну вот, вроде всё заработало. Одного пока только не пойму - info.StopLoss выдаёт мне какое значение - цену, по которой стоп стоит, или размер стопа в пунктах, т. е. насколько он далеко от текущей цены?

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#24 Сообщение Terranin » Пт май 25, 2007 12:24 pm

Komanch писал(а):Ну вот, вроде всё заработало. Одного пока только не пойму - info.StopLoss выдаёт мне какое значение - цену, по которой стоп стоит, или размер стопа в пунктах, т. е. насколько он далеко от текущей цены?
Выдает цену.
Asta la vista
Mike

Komanch
Сообщения: 42
Зарегистрирован: Пн апр 02, 2007 9:04 am
Откуда: Красноярск

#25 Сообщение Komanch » Пн май 28, 2007 9:01 am

А мне не хочет выдавать... :( Вставил для проверки такую строчку в код

...
temp:=FloatToSTR(info.StopLoss);
BreakPoint(1, temp);
...

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

Ответить