Автор |
Сообщение |
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Как то вот так
Код: |
quant = 18;
SetTradeDelays(0, 0, 0, 0);
Buy1 = C == HHV(C, 300) AND TimeNum() > 100001;
Sell1 = IIf(C == LLV(C, 100)AND TimeNum() > 100001,1,0);
Buy1 = ExRem(Buy1, Sell1);
Sell1 = ExRem(Sell1, Buy1);
BuyKey = SellKey = Size = pos = 0;
for (i = 1; i < BarCount; i++)
{
if (Buy1[i] == 1 AND pos == 0) {
Buy[i] = 1;
if(Volume[i] < quant) { // не хватает объем для набора позы
Size[i] = Volume[i];
pos = Volume[i];
BuyKey = 1;
}
else { // хватает. сразу берем полную позу
Size[i] = quant;
pos = quant;
}
}
else if (BuyKey) {
Buy[i] = sigScaleIn; // добираем позу
if(Volume[i] < (quant - pos)) { // опять не хватает
pos = pos + Volume[i];
Size[i] = Volume[i];
}
else { // хватает для полного набора
pos = quant;
Size[i] = (quant - pos);
BuyKey = 0; // снимаем ключ набора позы
}
}
else if (Sell1[i] == 1 AND pos > 0) {
if(Volume[i] < pos) { // не хватает сайза для полного закрытия
Buy[i] = sigScaleOut; // сокращаем позу
SellKey = 1;
Size[i] = Volume[i];
pos = pos - Volume[i];
}
else {
Sell[i] = 1; // закрываем лонг
pos = 0; // при закрытии Size не надо
}
}
else if (SellKey){
if(Volume[i] < pos) { // не хватает сайза для полного закрытия
pos = pos - Volume[i];
Buy[i] = sigScaleOut;
Size[i] = Volume[i];
}
else {
Sell[i] = 1; // закрываем лонг
pos = 0; // при закрытии Size не надо
SellKey = 0; // снимаем ключ сокращения позы
}
}
}
SetPositionSize(Size, 4);
|
Написал только для Buy Sell.
Один момент. Всегда забываю как надо писать сайз при доливке/отливке. Или надо конкретно размер самой доливки/отливки (так написал) или надо размер результирующей позы. Уточни и если надо исправь. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
shaly
Зарегистрирован: 01.07.2008
Сообщения: 53
Откуда: Омск
|
|
Посмотреть профиль Отправить личное сообщение |
|
shaly
Зарегистрирован: 01.07.2008
Сообщения: 53
Откуда: Омск
|
После тестирования и исправлений получился следующий код, который на мой взгляд ближе всего к цели
Код: |
quant = 18;
SetTradeDelays(0, 0, 0, 0);
Buy1 = IIf(C == HHV(C, 300) AND TimeNum() > 100001,1,0);
Sell1 = IIf(C == LLV(C,100) AND TimeNum() > 100001,1,0);
//Buy1 = ExRem(Buy1, Sell1);
//Sell1 = ExRem(Sell1, Buy1);
Addlong = Flip(Buy1, Sell1);
BuyKey[0] = SellKey[0] = Size[0] = pos[0] = Addlong[0] = 0;
//Buy1[0] = 0;
for (i = 1; i < BarCount; i++)
{
if (Buy1[i] == 1 AND pos[i-1] == 0) {
Buy[i] = 1;
if (Volume[i] < quant) {
Size[i] = Volume[i];
pos[i] = Volume[i];
//BuyKey[i] = 1;
}
else { // хватает. сразу берем полную позу
Size[i] = quant;
pos[i] = quant;
}
}
else if (Addlong[i-1] == 1 AND Buy1[i] == 1 ) {
Buy[i] = sigScaleIn; // добираем позу
if(Volume[i] < (quant - pos[i-1])) { // опять не хватает
pos[i] = pos[i-1] + Volume[i];
Size[i] = Volume[i];
//BuyKey[i] = BuyKey[i-1];
}
else { // хватает для полного набора
pos[i] = quant;
Size[i] = (quant - pos[i-1]);
//BuyKey[i] = 0; // снимаем ключ набора позы
}
}
else if (Sell1[i] == 1 AND pos[i-1] > 0) {
//Buy[i] = sigScaleOut;
if(Volume[i] < pos[i-1]) { // не хватает сайза для полного закрытия
Buy[i] = sigScaleOut; // сокращаем позу
//SellKey = 1;
Size[i] = Volume[i];
pos[i] = pos[i-1] - Volume[i];
}
else {
Sell[i] = 1; // закрываем лонг
pos[i] = 0; // при закрытии Size не надо
Size[i] = pos[i-1];
}
}
else if (Sell1[i] AND Addlong[i-1] == 0){
//Buy[i] = sigScaleOut;
if(Volume[i] < pos[i-1]) { // не хватает сайза для полного закрытия
pos[i] = pos[i-1] - Volume[i];
Buy[i] = sigScaleOut;
Size[i] = Volume[i];
//Sell[i] = 1;
}
else {
Sell[i] = 1; // закрываем лонг
pos[i] = 0; // при закрытии Size не надо
//SellKey = 0; // снимаем ключ сокращения позы
Size[i] = pos[i-1];
}
}
//else if (pos[i] == 0 AND pos[i-1] > 0)
//Sell[i] == 1;
else pos[i] = pos[i-1];
}
SetPositionSize(Size, 4);
Plot(C, "Close", colorBlack, styleCandle);
Plot(pos, "Volume", colorWhite, styleHistogram | styleOwnScale);
|
но в нем все таже проблема, нет добавления и разгрузки позиции. Если запустить тестер, то он правильно показывает открытие позиции, последующие добавления до нужного объема, ступенчатую разгрузку, в зависимости от объема сделки. Но почему то тут же их закрывает.
Что не так? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
shaly писал(а): |
Если запустить тестер, то он правильно показывает открытие позиции, последующие добавления до нужного объема, ступенчатую разгрузку, в зависимости от объема сделки. Но почему то тут же их закрывает.
Что не так? |
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
shaly
Зарегистрирован: 01.07.2008
Сообщения: 53
Откуда: Омск
|
Так как позиция набирается и зазгружается правильно, то решено сделать расчет относительно ее
Код: |
quant = 18;
SetTradeDelays(0, 0, 0, 0);
Buy1 = IIf(C == HHV(C, 300) AND TimeNum() > 100001,1,0);
Sell1 = IIf(C == LLV(C,100) AND TimeNum() > 100001,1,0);
Addlong = Flip(Buy1, Sell1);
BuyKey[0] = SellKey[0] = Size[0] = pos[0] = Addlong[0] = 0;
for (i = 1; i < BarCount; i++)
{
if (Buy1[i] == 1 AND pos[i-1] == 0) {
if (Volume[i] < quant AND Buy1[i] == 1) {
Size[i] = Volume[i];
pos[i] = Volume[i];
}
else { // хватает. сразу берем полную позу
Size[i] = quant;
pos[i] = quant;
}
}
else if (Addlong[i-1] == 1 AND Buy1[i] == 1 ) {
if(Volume[i] < (quant - pos[i-1])) { // опять не хватает
pos[i] = pos[i-1] + Volume[i];
Size[i] = Volume[i];
}
else { // хватает для полного набора
pos[i] = quant;
Size[i] = (quant - pos[i-1]);
}
}
else if (Sell1[i] == 1 AND pos[i-1] > 0) {
if(Volume[i] < pos[i-1]) { // не хватает сайза для полного закрытия
Size[i] = Volume[i];
pos[i] = pos[i-1] - Volume[i];
}
else {
pos[i] = 0; // при закрытии Size не надо
Size[i] = pos[i-1];
}
}
else if (Sell1[i] AND Addlong[i-1] == 0){
if(Volume[i] < pos[i-1]) { // не хватает сайза для полного закрытия
pos[i] = pos[i-1] - Volume[i];
Size[i] = Volume[i];
}
else {
pos[i] = 0; // при закрытии Size не надо
Size[i] = pos[i-1];
}
}
else pos[i] = pos[i-1];
}
Buy[0] = 0;
Sell[0] = 0;
pos[0] = 0;
for (i = 1; i < BarCount; i++) {
if (pos[i] > pos[i-1]){
if (pos[i-1] == 0)
Buy[i] = 1;
else
Buy[i] = sigScaleIn;
}
else if (pos[i] < pos[i-1]) {
if (pos[i] > 0)
Buy[i] = sigScaleOut;
}
else if (pos[i] == 0)
Sell[i] = 1;
}
SetPositionSize(Size, 4);
Plot(C, "Close", colorBlack, styleCandle);
Plot(pos, "Volume", colorWhite, styleHistogram | styleOwnScale);
Plot(Buy, "up", colorYellow, styleHistogram | styleOwnScale);
|
результат - проходит только первая серия добавления/разгрузки, а дальше - тишина. Что делать? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Уфф. Я один раз написал как надо. Чем не устроил тот вариант?
Ну вот еще раз. Индикатор. Можно смотреть на графике что и как
Код: |
SetBarsRequired(sbrAll, sbrAll);
quant = 20000;
SetTradeDelays(0, 0, 0, 0);
Buy1 = C == HHV(C, 300) AND TimeNum() > 100001;
Sell1 = C == LLV(C,100) AND TimeNum() > 100001;
Addlong = Flip(Buy1, Sell1);
BuyKey[0] = SellKey[0] = Size[0] = pos[0] = Addlong[0] = 0;
for (i = 1; i < BarCount; i++)
{
if (Buy1[i] == 1 AND pos[i-1] == 0) {
Buy[i] = 1;
if (Volume[i] < quant) {
Size[i] = Volume[i];
pos[i] = Volume[i];
}
else { // хватает. сразу берем полную позу
Size[i] = quant;
pos[i] = quant;
}
}
else if (Addlong[i] == 1 AND pos[i-1] < quant ) {
Buy[i] = sigScaleIn;
if(Volume[i] < (quant - pos[i-1])) { // опять не хватает
pos[i] = pos[i-1] + Volume[i];
Size[i] = Volume[i];
}
else { // хватает для полного набора
pos[i] = quant;
Size[i] = (quant - pos[i-1]);
}
}
else if (Sell1[i] == 1 AND pos[i-1] > 0) {
if(Volume[i] < pos[i-1]) { // не хватает сайза для полного закрытия
Buy[i] = sigScaleOut;
Size[i] = Volume[i];
pos[i] = pos[i-1] - Volume[i];
}
else {
Sell[i] = 1;
pos[i] = 0; // при закрытии Size не надо
//Size[i] = pos[i-1];
}
}
else if (Addlong[i-1] == 0 AND pos[i-1] > 0){
if(Volume[i] < pos[i-1]) { // не хватает сайза для полного закрытия
Buy[i] = sigScaleOut;
pos[i] = pos[i-1] - Volume[i];
Size[i] = Volume[i];
}
else {
Sell[i] = 1;
pos[i] = 0; // при закрытии Size не надо
//Size[i] = pos[i-1];
}
}
else
pos[i] = pos[i-1];
}
SetPositionSize(Size, 4);
Plot(C, "Close", IIf(Addlong, colorGreen, colorRed), styleCandle);
Plot(pos, "pos", colorBlue, styleOwnScale);
PlotShapes(IIf(Buy==1, shapeUpArrow, shapeNone), colorGreen, 0, L);
PlotShapes(IIf(Buy==sigScaleIn, shapeSmallUpTriangle, shapeNone), colorGreen, 0, L);
PlotShapes(IIf(Buy==sigScaleOut, shapeSmallDownTriangle, shapeNone), colorRed, 0, H);
PlotShapes(IIf(Sell==1, shapeDownArrow, shapeNone), colorRed, 0, H);
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
shaly
Зарегистрирован: 01.07.2008
Сообщения: 53
Откуда: Омск
|
000 писал(а): |
Уфф. Я один раз написал как надо. Чем не устроил тот вариант?
|
В том варианте, если в серии на доливку идет пропуск, т е на баре нет сигнала на покупку/продажу, то доливка/разгрузка прекращается и на последующих барах сделки не проходят, с разгрузкой аналогично. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
shaly
Зарегистрирован: 01.07.2008
Сообщения: 53
Откуда: Омск
|
Спасибо, этот вариант ближе к цели. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
nemoy
Зарегистрирован: 05.10.2014
Сообщения: 29
|
оригинальный код заголовка поста. для тестирования отрисовку стрелок лучше убрать. чтоб быстрее было
Код: |
SetPositionSize(35, spsPercentOfEquity);
k = Optimize("k",0.1, 0.002, 0.14, 0.001 );
NullPrice = Optimize("NullPrice",17000, 17000, 19000, 300 );
max_kolich_step= Optimize("step",9, 7, 13, 1 );
SetOption("AccountMargin", 40 );
SetOption("InitialEquity", 80000 );
step = k * NullPrice;
pos = EntryPrice = 0;
Buy = Sell =Short= Cover =0;
Buy = L <= (NullPrice - step);
BuyPrice = (NullPrice - step);
Sell = H >= (NullPrice + step) ;
SellPrice = (NullPrice + step) ;
Short = H >= (NullPrice + step) ;
ShortPrice = (NullPrice + step) ;
Cover= L <= (NullPrice - step);
CoverPrice = (NullPrice - step);
for( i = 1; i < BarCount; i++ )
{
if(pos == 0)
{
if(Buy[i] == 1)
{
kolich_sdelanyh_step=1;
pos = 1;
EntryPrice = BuyPrice[i];
}
if(Short[i] == 1)
{
kolich_sdelanyh_step1=1;
pos = -1;
EntryPrice1 = ShortPrice[i];
}
}
if(pos == 1 )
{
Buy[i] = 0;
if(Sell[i] == 1)
{
pos = 0;
}
else if(L [i] <= EntryPrice - 2 * step )
{
kolich_sdelanyh_step=kolich_sdelanyh_step+1;
EntryPrice = EntryPrice - 2 * step;
if(kolich_sdelanyh_step<=max_kolich_step)
{
Buy[i] = sigScaleIn; BuyPrice[i] = EntryPrice;
}
}
else if (H [i] >= EntryPrice + 2 * step)
{
EntryPrice = EntryPrice + 2 * step;
kolich_sdelanyh_step=kolich_sdelanyh_step-1;
if (kolich_sdelanyh_step<max_kolich_step)
{
Buy[i] = sigScaleOut; BuyPrice[i] = EntryPrice;
}
}
}
if(pos == -1)
{
Short[i] = 0;
if(Cover[i] == 1)
{
pos = 0;
}
else if(H[i] >= EntryPrice1 + 2 * step )
{
kolich_sdelanyh_step1=kolich_sdelanyh_step1+1;
EntryPrice1 = EntryPrice1 + 2 * step;
if(kolich_sdelanyh_step1<=max_kolich_step)
{
Short[i] = sigScaleIn; ShortPrice[i] = EntryPrice1;
}
}
else if (L [i] <= EntryPrice1 - 2 * step )
{
kolich_sdelanyh_step1=kolich_sdelanyh_step1-1;
EntryPrice1 = EntryPrice1 - 2 * step;
if ( kolich_sdelanyh_step1<max_kolich_step)
{
Short[i] = sigScaleOut; ShortPrice[i] = EntryPrice1;
}
}
}
}
PlotShapes( shapeHollowUpArrow*(Buy==sigScaleIn), colorGreen, 0, L, -12 );
PlotShapes( shapeHollowUpArrow*(Short==sigScaleOut), colorGreen, 0, L, -12 );
PlotShapes( shapeHollowDownArrow*(Short==sigScaleIn), colorRed, 0, H, -12 );
PlotShapes( shapeHollowDownArrow*(Buy==sigScaleOut), colorRed, 0, H, -12 );
|
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|