Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 Многоуровневый маркет-мейкинг Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вт Янв 06, 2015 7:43 pm Ответить с цитатой Вернуться к началу

Как то вот так
Код:

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
Откуда: Омск

СообщениеДобавлено: Чт Янв 08, 2015 4:47 pm Ответить с цитатой Вернуться к началу

Спасибо.
Посмотреть профиль Отправить личное сообщение
shaly



Зарегистрирован: 01.07.2008
Сообщения: 53
Откуда: Омск

СообщениеДобавлено: Пт Янв 09, 2015 6:08 pm Ответить с цитатой Вернуться к началу

После тестирования и исправлений получился следующий код, который на мой взгляд ближе всего к цели
Код:

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

СообщениеДобавлено: Сб Янв 10, 2015 11:53 pm Ответить с цитатой Вернуться к началу

shaly писал(а):
Если запустить тестер, то он правильно показывает открытие позиции, последующие добавления до нужного объема, ступенчатую разгрузку, в зависимости от объема сделки. Но почему то тут же их закрывает.
Что не так?

Question Question Question

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
shaly



Зарегистрирован: 01.07.2008
Сообщения: 53
Откуда: Омск

СообщениеДобавлено: Вс Янв 11, 2015 11:24 am Ответить с цитатой Вернуться к началу

Так как позиция набирается и зазгружается правильно, то решено сделать расчет относительно ее
Код:

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

СообщениеДобавлено: Вс Янв 11, 2015 6:29 pm Ответить с цитатой Вернуться к началу

Уфф. Я один раз написал как надо. Чем не устроил тот вариант?
Ну вот еще раз. Индикатор. Можно смотреть на графике что и как
Код:

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
Откуда: Омск

СообщениеДобавлено: Пн Янв 12, 2015 8:40 am Ответить с цитатой Вернуться к началу

000 писал(а):
Уфф. Я один раз написал как надо. Чем не устроил тот вариант?

В том варианте, если в серии на доливку идет пропуск, т е на баре нет сигнала на покупку/продажу, то доливка/разгрузка прекращается и на последующих барах сделки не проходят, с разгрузкой аналогично.
Посмотреть профиль Отправить личное сообщение
shaly



Зарегистрирован: 01.07.2008
Сообщения: 53
Откуда: Омск

СообщениеДобавлено: Вт Янв 13, 2015 9:00 am Ответить с цитатой Вернуться к началу

Спасибо, этот вариант ближе к цели.
Посмотреть профиль Отправить личное сообщение
nemoy



Зарегистрирован: 05.10.2014
Сообщения: 29

СообщениеДобавлено: Пн Мар 02, 2015 10:53 pm Ответить с цитатой Вернуться к началу

оригинальный код заголовка поста. для тестирования отрисовку стрелок лучше убрать. чтоб быстрее было
Код:


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 );
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen