Ниже, под спойлером, представлен код для тестирования торговли разностью (на принципах многоуровнего маркет-мейкинга с использованием фиксированного справедливого спреда) в программе технического анализа AmiBroker. Данный код рассчитывает пять типов графиков (Net Proft | Potential Profit | Potential Loss | Position Value | Deviation) по ценам сделок или по лучшим ценам спроса и предложения. Выбор типа отображаемого графика и цен, используеммых для его расчета осуществляется в окне настройки параметров (Parametrs). Настройки самих стратегий прописываются непосредственно в коде тестировщика.
График Net Profit Отображает Чистую прибыль/убыток, как по каждой отдельной стратегии (линейные графики), так и совокупную Чистую прибыль/убыток всех стратегий (диаграмма с областями). График Net Profit является результатом сложения графиков Potential Profit и Potential Loss с учетом бонуса в размере Потенциального убытка второго бара.
График Potential Profit Отображает Потенциальную прибыль, полученную от реверсивных движений спреда, как по каждой отдельной стратегии (линейные графики), так и совокупную Потенциальную прибыль всех стратегий (диаграмма с областями). ВАЖНО: Данная версия тестировщика рассчитывает Потенциальную прибыль по округленным значениям спреда, в реальной же торговле вход и выход из позиции практически всегда осуществляется по более выгодным ценам (без учета проскальзывания), в связи с чем реальные результаты, как правило, отличаются в лучшую сторону.
График Potential Loss Отображает Потенциальный убыток, полученный в результате отклонения спреда от своего справедливого уровня, как по каждой отдельной стратегии (линейные графики), так и совокупный Потенциальный убыток всех стратегий (диаграмма с областями).
График Position Value Отображает Стоимость позиций, как по каждой отдельной стратегии (линейные графики), так и совокупную Стоимость позиций всех стратегий (диаграмма с областями). ВАЖНО: Данная версия тестировщика рассчитывает совокупную Стоимость позиций без учета кросс-позиций по инструменту, используемому в разных стратегиях. Например, если по одной стратегии будет открыто 100 акций Лукойла в лонг , а по другой стратегии 80 акций Лукойла в шорт, то совокупная стоимость позиции будет рассчитана исходя из 180 акций Лукойла.
График Deviation Отображает величину Отклонения текущего округленного спреда от своего справедливого уровня для каждой отдельной стратегии.
ВНИМАНИЕ! Приведенные в коде настройки стратегий даны исключительно в целях демонстрации работы тестировщика.
////// Настройки Стратегии_1 ////// Amount_LKOH_1 = 10; // Задаем количество бумаг, (+) для Рабочих инструментов, (-) для Базисных инструментов Amount_GAZP_1 = -100; // Задаем количество бумаг, (+) для Рабочих инструментов, (-) для Базисных инструментов Step_1 = 200; // Задаем шаг котирования FairSpread_1 = 0; // Задаем значение справедливого спреда Spread_1=(Price_LKOH*Amount_LKOH_1)+(Price_GAZP*Amount_GAZP_1); // Суммируем произведения цены и количества всех инструментов данной стратегии Value_1=abs(Price_LKOH*Amount_LKOH_1)+abs(Price_GAZP*Amount_GAZP_1); // Суммируем абсолютные произведения цены и количества всех инструментов данной стратегии Round_1=round(Spread_1/Step_1)*Step_1; RoundF_1=floor(Spread_1/Step_1)*Step_1; RoundC_1=ceil(Spread_1/Step_1)*Step_1;
////// Настройки Стратегии_2 ////// Amount_SBER_2 = 200; // Задаем количество бумаг, (+) для Рабочих инструментов, (-) для Базисных инструментов Amount_VTBR_2 = -200000; // Задаем количество бумаг, (+) для Рабочих инструментов, (-) для Базисных инструментов Step_2 = 200; // Задаем шаг котирования FairSpread_2 = 0; // Задаем значение справедливого спреда Spread_2=(Price_SBER*Amount_SBER_2)+(Price_VTBR*Amount_VTBR_2); // Суммируем произведения цены и количества всех инструментов данной стратегии Value_2=abs(Price_SBER*Amount_SBER_2)+abs(Price_VTBR*Amount_VTBR_2); // Суммируем абсолютные произведения цены и количества всех инструментов данной стратегии Round_2=round(Spread_2/Step_2)*Step_2; RoundF_2=floor(Spread_2/Step_2)*Step_2; RoundC_2=ceil(Spread_2/Step_2)*Step_2;
/* ////// Настройки Стратегии_N ////// Amount_XXXX_N = 100; // Задаем количество бумаг, (+) для Рабочих инструментов, (-) для Базисных инструментов Amount_YYYY_N = -100; // Задаем количество бумаг, (+) для Рабочих инструментов, (-) для Базисных инструментов Step_N = 100; // Задаем шаг котирования FairSpread_N = 0; // Задаем значение справедливого спреда Spread_N=(Price_XXXX*Amount_XXXX_N)+(Price_YYYY*Amount_YYYY_N); // Суммируем произведения цены и количества всех инструментов данной стратегии Value_N=abs(Price_XXXX*Amount_XXXX_N)+abs(Price_YYYY*Amount_YYYY_N); // Суммируем абсолютные произведения цены и количества всех инструментов данной стратегии Round_N=round(Spread_N/Step_N)*Step_N; RoundF_N=floor(Spread_N/Step_N)*Step_N; RoundC_N=ceil(Spread_N/Step_N)*Step_N; */
////// Алгоритмы ////// for(i=0;i<1;i++) { CumMove_1[i]=0; CumMove_2[i]=0; // CumMove_N[i]=0; // Добавляем переменную CumMove_N для каждой новой Стратегии_N }
PotentialProfit[i]=PotentialProfit_1[i]+PotentialProfit_2[i]; // Суммируем переменные PotentialProfit_N всех стратегий PotentialLoss[i]=PotentialLoss_1[i]+PotentialLoss_2[i]; // Суммируем переменные PotentialLoss_N всех стратегий NetProfit[i]=NetProfit_1[i]+NetProfit_2[i]; // Суммируем переменные NetProfit_N всех стратегий PositionValue[i]=PositionValue_1[i]+PositionValue_2[i]; // Суммируем переменные PositionValue_N всех стратегий }
////// Графики ////// if (ChartType=="Net Profit"){ Plot(NetProfit_1,"NetProfit_1",colorBlue,style=1); Plot(NetProfit_2,"NetProfit_2",colorRed,style=1); //Plot(NetProfit_N,"NetProfit_N",colorGreen,style=1); // Добавляем график NetProfit_N для каждой новой Стратегии_N Plot(NetProfit,"NetProfit",colorLightBlue,style=16384);}
if (ChartType=="Potential Profit"){ Plot(PotentialProfit_1,"PotentialProfit_1",colorBlue,style=1); Plot(PotentialProfit_2,"PotentialProfit_2",colorRed,style=1); //Plot(PotentialProfit_N,"PotentialProfit_N",colorGreen,style=1); // Добавляем график PotentialProfit_N для каждой новой Стратегии_N Plot(PotentialProfit,"PotentialProfit",colorLightBlue,style=16384);}
if (ChartType=="Potential Loss"){ Plot(PotentialLoss_1,"PotentialLoss_1",colorBlue,style=1); Plot(PotentialLoss_2,"PotentialLoss_2",colorRed,style=1); //Plot(PotentialLoss_N,"PotentialLoss_N",colorGreen,style=1); // Добавляем график PotentialLoss_N для каждой новой Стратегии_N Plot(PotentialLoss,"PotentialLoss",colorPink,style=16384);}
if (ChartType=="Postion Value"){ Plot(PositionValue_1,"PositionValue_1",colorBlue,style=1); Plot(PositionValue_2,"PositionValue2",colorRed,style=1); //Plot(PositionValue_N,"PositionValue_N",colorGreen,style=1); // Добавляем график PositionValue_N для каждой новой Стратегии_N Plot(PositionValue,"PositionValue",colorLightGrey,style=16384);}
if (ChartType=="Deviation"){ Plot(0,"ZeroLevel",colorBlack,style=1); Plot(Deviation_1,"Deviation_1",colorBlue,style=1); Plot(Deviation_2,"Deviation_2",colorRed,style=1); //Plot(Deviation_N,"Deviation_N",colorGreen,style=1); // Добавляем график Deviation_N для каждой новой стратегии }