Ламерский вопрос
-
- Сообщения: 42
- Зарегистрирован: Пн апр 02, 2007 9:04 am
- Откуда: Красноярск
Ламерский вопрос
Доброго времени суток уважаемому автору. Программу использую давно в режиме ручного тестирования. Хочу теперь освоить автоматизацию, в связи с чем у меня вопрос - что такое API, с чем его есть? Если я правильно понимаю, для написания индюков и стратегий необходимо установить Delphi и всё писать в нём, а потом скомпилированную dll куда-то помещать?
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Re: Ламерский вопрос
API это набор функций для написания индикаторов и советников. На данный мемент доступно АПИ для Delphi и C++ (для С++ пока только АПИ стратегий).Komanch писал(а):Доброго времени суток уважаемому автору. Программу использую давно в режиме ручного тестирования. Хочу теперь освоить автоматизацию, в связи с чем у меня вопрос - что такое API, с чем его есть? Если я правильно понимаю, для написания индюков и стратегий необходимо установить Delphi и всё писать в нём, а потом скомпилированную dll куда-то помещать?
Вобщем это в случае Delphi 2 файла - StrategiesInterfaceUnit.pas и TechnicalFunctions.pas которые Вы подключаете к своему проекту в виде длл и используете. Смотрите примеры в папке Examples после установки программы а также хелп по стратегиям и индикаторам.
Когда сделаете длл ее надо просто скопировать в папку Strategies и перезапустить тестер. Если все ок, Вы увидите новую стратегию в списке стратегий.
Для индикаторов нужно зайти в Файл->Установить новый индикатор и указать на длл индикатора.
Asta la vista
Mike
Mike
-
- Сообщения: 42
- Зарегистрирован: Пн апр 02, 2007 9:04 am
- Откуда: Красноярск
Ещё вопрос
Доброго времени суток! Вопрос такой у меня. Можно ли в функциях управления ордерами использовать в качестве параметров не переменные, а другие функции. Например, функции доступа к барам. Т. е., будет ли работать так
ModifyOrder(OrderHandle,Close(6),0);
Или надо сделать так
var SL: double;
...
SL:=Close(6);
ModifyOrder(OrderHandle,SL,0);
И ещё вопрос. Функция ModifyOrder и др. становятся доступны только после вызова функции OrderSelect. Так вот, когда OrderSelect необходимо вызывать? Сразу перед, т. е. предыдущей строчкой? Или можно сколько-то раньше? Если да то когда?
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: Ещё вопрос
Будут работать оба варианта, функции можно использовать как параметры процедур.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
Mike
-
- Сообщения: 42
- Зарегистрирован: Пн апр 02, 2007 9:04 am
- Откуда: Красноярск
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Хендл ордера выдается системой при установке ордера и является уникальным. MagicNumber задается самим пользователем и может быть одинаковым для разных ордеров, чтобы например пометить несколько ордров одним и тем же номером например для разных стратегий разным чтобы они не путались с чужими ордерами.Komanch писал(а):Ну да, это я попутал, когда печатал, сорри. Я имел в виду функцию OrderStopLoss.
А MagicNumber ордера и его хэндл чем нибудь принципиально отличаются? Как я понял, доступ к информации об ордере может быть и так и так.
Asta la vista
Mike
Mike
-
- Сообщения: 42
- Зарегистрирован: Пн апр 02, 2007 9:04 am
- Откуда: Красноярск
-
- Сообщения: 42
- Зарегистрирован: Пн апр 02, 2007 9:04 am
- Откуда: Красноярск
Доброго времени суток! Такой вопрос у меня - в стратегиях можно использовать индикаторы, подключив их процедурой. А можно ли делать это в своих индикаторах? Т. е., например, я хочу, чтобы индикатор давал мне сигнал если скользящая средняя больше или меньше себя самой сколько-то баров назад. Можно ли не рассчитывать МА в индюке а обратиться к уже существующему?
-
- Сообщения: 80
- Зарегистрирован: Пн окт 23, 2006 9:30 am
Да, терранин, это уже второй ччеловек просит! Может все же как-то...Komanch писал(а):Доброго времени суток! Такой вопрос у меня - в стратегиях можно использовать индикаторы, подключив их процедурой. А можно ли делать это в своих индикаторах? Т. е., например, я хочу, чтобы индикатор давал мне сигнал если скользящая средняя больше или меньше себя самой сколько-то баров назад. Можно ли не рассчитывать МА в индюке а обратиться к уже существующему?
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Пока нет времени. Все же это можно пока и обычными средствами обойти, это только леньки...wellx писал(а):Да, терранин, это уже второй ччеловек просит! Может все же как-то...Komanch писал(а):Доброго времени суток! Такой вопрос у меня - в стратегиях можно использовать индикаторы, подключив их процедурой. А можно ли делать это в своих индикаторах? Т. е., например, я хочу, чтобы индикатор давал мне сигнал если скользящая средняя больше или меньше себя самой сколько-то баров назад. Можно ли не рассчитывать МА в индюке а обратиться к уже существующему?
Asta la vista
Mike
Mike
-
- Сообщения: 80
- Зарегистрирован: Пн окт 23, 2006 9:30 am
Пока да, можно обойтись. Но в теории тут вот какая бяка, если кто-то выложит свой индикатор без исходников или даже с исходниками, но постоянно будет выпускать новые версии, то вместо стабильного кода с вызовом индикатора у себя я буду постоянно иметь проблемы с адоптацией меняющегося кода у себя внутри. Зачем мне этот гимор? Вообще получается уже как бы 3 класса : индикатор, графическая система на базе стандартых автономных индикаторов , стратегии. Вот для граф.систем и нужны вызовы. Это как бы не стратегия в чистом виде.Terranin писал(а):Пока нет времени. Все же это можно пока и обычными средствами обойти, это только леньки...wellx писал(а):Да, терранин, это уже второй ччеловек просит! Может все же как-то...Komanch писал(а):Доброго времени суток! Такой вопрос у меня - в стратегиях можно использовать индикаторы, подключив их процедурой. А можно ли делать это в своих индикаторах? Т. е., например, я хочу, чтобы индикатор давал мне сигнал если скользящая средняя больше или меньше себя самой сколько-то баров назад. Можно ли не рассчитывать МА в индюке а обратиться к уже существующему?
-
- Сообщения: 42
- Зарегистрирован: Пн апр 02, 2007 9:04 am
- Откуда: Красноярск
-
- Сообщения: 42
- Зарегистрирован: Пн апр 02, 2007 9:04 am
- Откуда: Красноярск
Доброго времени суток.
Пишу такую строчку
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
begin
...
На этой строке (во втором условии) компилятор выдаёт сообщение
Operator not applicable to this operand type
Где я ошибся? Что к чему неприменимо и как правильно? Я хочу проверить наличие позиции на покупку.
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 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
Mike
-
- Сообщения: 42
- Зарегистрирован: Пн апр 02, 2007 9:04 am
- Откуда: Красноярск
Доброго времени суток.
Никак не могу заставить стратегию делать то, что я хочу .В связи с чем у меня вопрос - какое значение вернёт функция
OrderSelect(OrderHandle, SELECT_BY_TICKET, MODE_TRADES)
если искомая позиция закрыта по стоп-лоссу? Поскольку параметр поиска стоит "MODE_TRADES", то функция должна вернуть значение false, я правильно понимаю?
Никак не могу заставить стратегию делать то, что я хочу .В связи с чем у меня вопрос - какое значение вернёт функция
OrderSelect(OrderHandle, SELECT_BY_TICKET, MODE_TRADES)
если искомая позиция закрыта по стоп-лоссу? Поскольку параметр поиска стоит "MODE_TRADES", то функция должна вернуть значение false, я правильно понимаю?
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Да, правильно. Когда ордер закрыт неважно каким образом, вручную или по стоп-лоссу/тейк-профиту ордер переносится из списка открытых позиций в список истории.Komanch писал(а):Доброго времени суток.
Никак не могу заставить стратегию делать то, что я хочу .В связи с чем у меня вопрос - какое значение вернёт функция
OrderSelect(OrderHandle, SELECT_BY_TICKET, MODE_TRADES)
если искомая позиция закрыта по стоп-лоссу? Поскольку параметр поиска стоит "MODE_TRADES", то функция должна вернуть значение false, я правильно понимаю?
Asta la vista
Mike
Mike
-
- Сообщения: 42
- Зарегистрирован: Пн апр 02, 2007 9:04 am
- Откуда: Красноярск
Хм… Сдаётся мне, что у меня функция 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. А она на каждой свечке пытается передвинуть стоп, не находя, естественно, закрытой уже позиции.
Если я где-то ошибаюсь, то где?
На всякий случай прикрепляю файл с полным исходником стратегии. Надеюсь, что там более-менее понятно…
……..
// Проверка начала дня
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
-
- Сообщения: 42
- Зарегистрирован: Пн апр 02, 2007 9:04 am
- Откуда: Красноярск
Ага! Я так и думал... В принципе мне помогла замена на функцию GetOrderInfo, которая работает как положено - если позиция закрыта, то возвращается значение false. Только я не совсем понял, как обращаться с информационной структурой. В частности, как из заполненной структуры получить что-то одно (например, размер стопа), и как привести полученный тип ордера к нормальному виду. В справке есть указание, что это надо сделать, а как не сказано...
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 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
Mike
-
- Сообщения: 42
- Зарегистрирован: Пн апр 02, 2007 9:04 am
- Откуда: Красноярск
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
-
- Сообщения: 42
- Зарегистрирован: Пн апр 02, 2007 9:04 am
- Откуда: Красноярск
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
-
- Сообщения: 42
- Зарегистрирован: Пн апр 02, 2007 9:04 am
- Откуда: Красноярск