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

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

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

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

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

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

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

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

Ещё вопрос

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

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

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

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

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

Re: Ещё вопрос

Добавлено: Пн апр 23, 2007 3:40 pm
Terranin
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 и т.д. Выбрали ордер и читаем его поля. Поскольку в эти функции хэндл ордера не передается то значит его надо сначала выбрать.

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

Добавлено: Вт апр 24, 2007 5:53 am
Terranin
Komanch писал(а):Ну да, это я попутал, когда печатал, сорри. Я имел в виду функцию OrderStopLoss.
А MagicNumber ордера и его хэндл чем нибудь принципиально отличаются? Как я понял, доступ к информации об ордере может быть и так и так.
Хендл ордера выдается системой при установке ордера и является уникальным. MagicNumber задается самим пользователем и может быть одинаковым для разных ордеров, чтобы например пометить несколько ордров одним и тем же номером например для разных стратегий разным чтобы они не путались с чужими ордерами.

Добавлено: Вт апр 24, 2007 7:05 am
Komanch
Понял, спасибо!

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

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

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

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

Добавлено: Чт апр 26, 2007 10:09 am
Komanch
"...это только леньки... " Которые, как известно, двигатель прогресса! :wink:

Добавлено: Вс апр 29, 2007 8:56 am
Komanch
Доброго времени суток.
Пишу такую строчку

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


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

Operator not applicable to this operand type


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

Добавлено: Вс апр 29, 2007 2:47 pm
Terranin
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

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

OrderSelect(OrderHandle, SELECT_BY_TICKET, MODE_TRADES)

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

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

OrderSelect(OrderHandle, SELECT_BY_TICKET, MODE_TRADES)

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

Добавлено: Пн май 21, 2007 1:20 pm
Komanch
Хм… Сдаётся мне, что у меня функция 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. А она на каждой свечке пытается передвинуть стоп, не находя, естественно, закрытой уже позиции.
Если я где-то ошибаюсь, то где?
На всякий случай прикрепляю файл с полным исходником стратегии. Надеюсь, что там более-менее понятно…

Добавлено: Пн май 21, 2007 1:40 pm
Terranin
Пардон, я тут наврал насчет функции. В целях совместимости с MQL4 функция работает так же как там. Т.е. при поиске по хэндлу ордера она ищет и в открытых позициях и в истории и параметр MODE_TRADES игнорируется. Проверить что ордер закрыт можно функцией OrderClosed.

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

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

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

var
  info: info: TTradePosition;

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

if TTradePositionType(info.PosType) <> tp_Buy then ...

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

Добавлено: Чт май 24, 2007 2:53 pm
Terranin
;)

Добавлено: Пт май 25, 2007 7:37 am
Komanch
Ну вот, вроде всё заработало. Одного пока только не пойму - info.StopLoss выдаёт мне какое значение - цену, по которой стоп стоит, или размер стопа в пунктах, т. е. насколько он далеко от текущей цены?

Добавлено: Пт май 25, 2007 12:24 pm
Terranin
Komanch писал(а):Ну вот, вроде всё заработало. Одного пока только не пойму - info.StopLoss выдаёт мне какое значение - цену, по которой стоп стоит, или размер стопа в пунктах, т. е. насколько он далеко от текущей цены?
Выдает цену.

Добавлено: Пн май 28, 2007 9:01 am
Komanch
А мне не хочет выдавать... :( Вставил для проверки такую строчку в код

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

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