Несколько вопросов по стопам, заявкам и позиции
Есть простой скрипт, который шортит. В нем есть тейк-профит и стоп-лосс.
Фрагменты:
Short = Cross(MA( Close , 12 ), MA( Close , 7 ));
Cover = Cross(MA( Close , 7 ), MA( Close , 12 ));
Cover = ExRem(Cover,Short);
Short = ExRem(Short,Cover);
ApplyStop(stopTypeProfit, stopModePoint, 0.9*ATR(1), True, True );
ApplyStop(stopTypeLoss,stopModePercent, 1, True );
CurrentPosition = StrToNum(StaticVarGetText("POSITION"));
if (CurrentPosition == 0)
{ if (LastValue(Short))
{ Make_Order(ClassCode,SecCode,"Sell",Size);
StaticVarSetText("POSITION","" + CurrentPosition);
}
}
else
{ if (LastValue(Cover))
{ Make_Order(ClassCode,SecCode,"Buy",CurrentPosition);
StaticVarSetText("POSITION","0");
}
}
Вопросы:
1) Как сделать чтобы амишарп все это добро отрабатывал?
2) Как получать размер позиции из квика? Точнее нужно так чтобы амишарп получал размер депозита на счету, вычислял процент (допустим 70), делил на ГО и получал количество контрактов (речь про индекс на фьючерс) и оперировал именно этим количеством.
Заранее благодарен!
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
В соответствии с вашим порядком вопросов.
1. ApplyStop. Его использовать можно, но я категорически не рекомендую это делать при роботизированной торговле. Функция предназначена для бектеста и оптимизации, для торговли несколькими скриптами одновременно - ни в коем случае. Как быть? Написать все стоп-лоссы и тейк-профиты на афл - ничего сложного в этом нет. Вот пример. www.bot4sale.ru/blog-menu/ami/amibroker-...1-trailing-stop.html Да еще и нарисовать можно линии стопов на экране, что невозможно при использовании ApplyStop.
Размер позиции из квика - вообще элементарно. Транслируете по DDE в амишарп таблицу, содержащую ваши текущие деньги (это таблица ограничений по деньгам), читаете ее из скрипта и делаете с полученными цифрами что угодно.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Спасибо большое за ответ, вот эта часть только не понятна. Каким образом ее читать? Я бы хотел читать две таблицы. Текущая чистая позиция и деньги на счету. А то current position странно расчитываетсяadmin пишет: читаете ее из скрипта и делаете с полученными цифрами что угодно.
Насчет стопов, верно ли я заменил строку
ApplyStop(stopTypeLoss,stopModePercent, 1, True );
На такой блок
MaxValue = HighestSince(Short,Low);
StopLevel = MaxValue + 0.01*(цена продажи); <- не знаю как получить цену последней продажи, и что хуже всего в сделке может быть несколько лотов по разным ценам, видимо нужна средняя?
Plot(StopLevel,"Stop",colorRed);
BuyByTrail = Ref(Close > StopLevel,-1);
Buy = Buy OR BuyByTrail;
А вот как заменить
ApplyStop(stopTypeProfit, stopModePoint, 0.9*ATR(1), True, True );
я не могу понять вобще ((
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Настраиваете трансляцию нужной вам таблицы в амишарп (примерно так:
У вас в амишарпе появится копия квиковской таблички. Вы можете ее посмотреть. А дальше читайте ее методами амишарпа
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
не знаю как получить цену последней продажи, и что хуже всего в сделке может быть несколько лотов по разным ценам, видимо нужна средняя?
Цену сделки можно
- Рассчитать. В этом случае за цену сделки принимается цена инструмента в момент появления сигнала
- Получить реальные цены. В этом случае нужно получить все сделки по заявке и усреднить.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Еще вопрос, как в левый верхний угол графика вывести текущие значения каких-то переменных?
Правильно ли я получаю размер позиции?
Size = round(AmiSharp.GetCellName("[testbook]limit","CBPLIMIT",1)*0.7/10000);
прим: 70% от депозита, при ГО = 10000 руб.
И текущую позицию:
CurrentPosition = AmiSharp.GetCellName("[testbook]position","TOTAL_NET",1);
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
переменная выдает среднюю цену шорта
Такой переменной не существует.
Не знаю задачи, которую вы решаете, но можно попробовать так: Берете номер заявки, которую вы отправили, смотрите в таблице сделок все сделки, которые были порождны этой заявкой и высчитываете среднее.
Правильно ли я получаю размер позиции?
Если в обеих таблицах у вас по одной строчке - то вроде правильно. распечатайте получаемые значения и убедитесь в этом

Единственно надо понимать, что амишарп ВСЕГДА возвращает строки. Перед математическими действиями нужно привести их к числам.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Строчки по одной да, а каким образом "распечатать"?
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- смотрите номер заявки, которая породила позицию
- в таблице сделок собираете все сделки, которые порождены этой заявкой
- вычисляете среднюю цену. Теперь вы знаете цену входа.
- от цены входа откладываете вверх ваши 100 пунктов (для лонга) и если текущая цена выше - закрываете позицию
- с ценой тейкпрофита слегка сложнее. Берете макс значение за время жизни позиции, вычитаете из него значение atr() и если цена ниже - опять закрываете позиции.
Распечатать - функция _trace()
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
sstyle пишет: А можно как-то вывести в левый угол графика цены значения Size и CurrentPosition?
На примере стандартного индикатора Price. Он выглядит так:
SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));
Plot( C, "Close", ParamColor("Color", colorDefault ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() );
Изменяем
_SECTION_BEGIN("Price");
SetChartOptions(0,chartShowArrows|chartShowDates);
Position=100;
Price=999;
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%)\n Position=%g, Price=%g {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ),Position,Price));
Plot( C, "Close", ParamColor("Color", colorDefault ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() );
_SECTION_END();
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Вот совсем не проще чем эплай стоп. А никак нельзя эплай прикрутить к амишарп? Не уверен что справлюсь с такими сложными скриптами. Вывод строк в угол графика получился, огромное спасибо!admin пишет:
- смотрите номер заявки, которая породила позицию
- в таблице сделок собираете все сделки, которые порождены этой заявкой
- вычисляете среднюю цену. Теперь вы знаете цену входа.
- от цены входа откладываете вверх ваши 100 пунктов (для лонга) и если текущая цена выше - закрываете позицию
- с ценой тейкпрофита слегка сложнее. Берете макс значение за время жизни позиции, вычитаете из него значение atr() и если цена ниже - опять закрываете позиции.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Ну тогда делайте applystop и бог с ним. В нужный момент он сам сделает вам сигнал Sell или сигнал Cover. Ваша задача будет в том, чтобы на последней (правой) свече этот сигнал увидеть и пульнуть в амишарп нужную транзакцию
Но будьте внимательны, если заходите одновременно запустить несколько скриптов.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Эм, а что это значит? По идее эплайстоп должен сформировать сигнал на покупку. Амишарп должен подхватить автоматом сигнал, нет?admin пишет: Ваша задача будет в том, чтобы на последней (правой) свече этот сигнал увидеть и пульнуть в амишарп нужную транзакцию
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

А вот робот - обязан. Если используется один из фреймворков, написанных мной - они будут ловить эти сигналы и отправлять транзакции. Если пишете робота сами - то это ваша забота.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
оу, а этот фреймворк где то выложен?admin пишет: Сам Амишарп никому ничего не должен
А вот робот - обязан. Если используется один из фреймворков, написанных мной - они будут ловить эти сигналы и отправлять транзакции. Если пишете робота сами - то это ваша забота.
Я думал что этот код:
if (LastValue(Cover))
{ Make_Order(ClassCode,SecCode,"Buy",abs(CurrentPosition));
StaticVarSetText("POSITION","0");
}
Как раз и "следит" за сигналом, в т.ч. от applystop.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
sstyle пишет: оу, а этот фреймворк где то выложен?
Видео
Фреймворк продается.
Я думал что этот код:
if (LastValue(Cover))
{ Make_Order(ClassCode,SecCode,"Buy",abs(CurrentPosition));
StaticVarSetText("POSITION","0");
}
Как раз и "следит" за сигналом, в т.ч. от applystop.
Верно. Этот фрагмент робота следит за появлением сигнала в последней свече и просит амишарп отправить заявку.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Еще вопрос, в бектесте есть ActivateStopsImmediately опция, а в рилтайме это так и есть автоматом?
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
sstyle пишет: напишите пожалуйста сколько стоит фреймворк.
Ответил почтой
Еще вопрос, в бектесте есть ActivateStopsImmediately опция, а в рилтайме это так и есть автоматом?
Боюсь соврать. Я не пользуюсь этими возможностями. Может, кто-то из посетителей форума сможет помочь?
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Еще вопрос - вот так верно, или много лишних повторяющихся строк? Код для амишарпа верный?
Sell = Short = Cross(MA( Close , MAt4 ), MA( Close , MAt3 ));
Buy = Cover = Cross(MA( Close , MAt3 ), MA( Close , MAt4 ));
Cover = ExRem(Cover,Short);
Short = ExRem(Short,Cover);
Buy = ExRem(Buy,Sell);
Sell = ExRem(Sell,Buy);
AlertIf( Short, "SOUND C:\\Windows\\Media\\Ding.wav", "Audio alert", 1 );
AlertIf( Cover, "SOUND C:\\Windows\\Media\\Ding.wav", "Audio alert", 1 );
AlertIf( Buy, "SOUND C:\\Windows\\Media\\Ding.wav", "Audio alert", 1 );
AlertIf( Sell, "SOUND C:\\Windows\\Media\\Ding.wav", "Audio alert", 1 );
PlotShapes(Cover * shapeUpArrow,colorGreen);
PlotShapes(Short * shapeDownArrow,colorBlue);
PlotShapes(Buy * shapeUpArrow,colorGreen);
PlotShapes(Sell * shapeDownArrow,colorBlue);
...
....
if (CurrentPosition == 0)
{ if (LastValue(Short))
{ Make_Order(ClassCode,SecCode,"Sell",Size);
StaticVarSetText("POSITION","" + CurrentPosition);
}
if (LastValue(Buy))
{ Make_Order(ClassCode,SecCode,"Buy",Size);
StaticVarSetText("POSITION","" + CurrentPosition);
}
}
else
{ if (LastValue(Cover))
{ Make_Order(ClassCode,SecCode,"Buy",abs(CurrentPosition)+Size);
StaticVarSetText("POSITION","" + CurrentPosition);
}
if (LastValue(Sell))
{ Make_Order(ClassCode,SecCode,"Sell",abs(CurrentPosition)+Size);
StaticVarSetText("POSITION","" + CurrentPosition);
}
}
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
я не увидел ни одной повторяющейся строки

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
PlotShapes(Buy * shapeUpArrow,colorGreen);
Это ведь одновременное событие, а стрелки две будет?
тоже самое и с алертами.
А код амишарпа верный?
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
PlotShapes(Cover * shapeUpArrow,colorGreen);
PlotShapes(Buy * shapeUpArrow,colorGreen);
Это ведь одновременное событие, а стрелки две будет?
Cover и Buy - совершенно разные массивы, никак не связанные друг с другом.
Значения этих массивов на некоторых свечах могут совпадать (тогда это реверсивная система и стрелки будут нарисованы на одинаковых свечах). Но могут и не совпадать.
тоже самое и с алертами
Именно. То же самое

Даже не сомневайтесьА код амишарпа верный?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Прога насчитала - 3 фьючерса. Текущая позиция -2. Срабатывает сигнал, должен купить 5. В квике я могу купить 5.
А вот амишарп ругается:
23.09.2014 16:51:50 QuikSendSyncTransaction("ACTION=NEW_ORDER;TRANS_ID=1630;SECCODE=RIZ4;QUANTITY=5;OPERATION=B;CLASSCODE=SPBFUT;ACCOUNT=SPBFUT00wrd;CLIENT_CODE=SPBFUT00wrd;TYPE=M;TYPE=L;PRICE=121690;") = 1,0,Ошибка создания заявки. [FORTS][332] "Нехватка средств по лимитам клиента.".,0,
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Ругается не амишарп, а брокер. Он не разрешает Вам выставить заявку в таком объеме.
Это особенность торговой системы. Сначала в вашем случае позицию надо закрыть, а потом открыть новую. Тогда сможете войти на 3 контракта в лонг.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
if (LastValue(Cover))
{ Make_Order(ClassCode,SecCode,"Buy",abs(CurrentPosition)+Size);
StaticVarSetText("POSITION","" + CurrentPosition);
}
надо написать
if (LastValue(Cover))
{ Make_Order(ClassCode,SecCode,"Buy",abs(CurrentPosition));
Make_Order(ClassCode,SecCode,"Buy",Size);
StaticVarSetText("POSITION","" + CurrentPosition);
}
?
Еще одна проблема. Получаю размер ГО из таблицы, а там он через запятаю вместо точки. Соответственно в число не переводится(StrToNum не работает), можно это как-то побороть?
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Что касается точек и запятых: ПОЛУЧЕНИЕ РЕГИОНАЛЬНЫХ НАСТРОЕК
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.