Программирование - это просто
Advertisement
Главная arrow C#, Delphi, VB, F#, Web и пр. arrow Прочее программирование arrow Создаем биржевого робота уроки, статьи, идеи arrow Продолжим писать класс статистического анализа индикатора (repeat, until).
18.12.2018 г.
Главное меню
Главная
Системный подход
Интернет магазин
Биржевые роботы
Программные продукты
Математика и информатика
1С:Предприятие
C#, Delphi, VB, F#, Web и пр.
Искусственный интеллект
Услуги
Ча. Во. (FAQ)
Платный раздел
Наука для чайников
Разное
Размышления
Карта сайта
Друзья сайта
Excel-это не сложно
Все о финансах
Продолжим писать класс статистического анализа индикатора (repeat, until). Печать E-mail
Автор megabax   
19.11.2009 г.
New Page 1

Продолжим писать класс статистического анализа индикатора (repeat, until).

Все статьи по данной теме.

Сегодня мы продолжим писать класс для анализа индикатора momentum, который начали на прошлом уроке  Мы уже создали базовые классы. Теперь создадим основные, рабочие классы. Начнем с TPASSStatAnalizMomentum:

TPASSStatAnalizMomentum=class(TPASSStatAnalizTemplate)
     function FindSignal:boolean; override;
     function FindSignalRotate:boolean; override;
     procedure Test;
end;

Как видим, в этом классе мы реализуем абстрактные методы FindSignal и FindSignalRotate родительского класса:

function TPASSStatAnalizMomentum.FindSignal:boolean;
var LastCandleIndex:integer; s:string;
begin
     Result:=false;
     LastCandleIndex:=1;
     repeat
         if FIndicator.GetResultByFieldName('Value')=0 then LastCandleIndex:=2 else LastCandleIndex:=1;
         if (FIndicator.GetResultByFieldName('Value')>=0) and
            (FIndicator.GetResultByFieldNameAndIndex('Value',FIndicator.PriceSource.CurrentItemIndex-LastCandleIndex)<0) then
         begin
             FSignalType:=enBuy;
             Result:=true;
             exit;
         end;
         if (FIndicator.GetResultByFieldName('Value')<0) and
             (FIndicator.GetResultByFieldNameAndIndex('Value',FIndicator.PriceSource.CurrentItemIndex-LastCandleIndex)>=0) then
        begin
            FSignalType:=enSell;
            Result:=true;
            exit;
        end;
    until not FIndicator.Next;
end;

function TPASSStatAnalizMomentum.FindSignalRotate:boolean;
var LastSignalType:TPASSSignalsTypes; toNext:boolean;
begin
    LastSignalType:=FSignalType;
    toNext:=true;
    if not(FIndicator.PriceSource.NextItem) then
    begin
       Result:=false;
       exit;
    end;
    repeat
        if not FindSignal then
        begin
           Result:=false;
           exit;
        end;
        if (LastSignalType=enBuy) and (FSignalType=enSell) then
        begin
          Result:=true;
          exit;
        end;
        if (LastSignalType=enSell) and (FSignalType=enBuy) then
        begin
           Result:=true;
           exit;
        end;
   until toNext;
   Result:=false;
end;

Сигнал ищется следующим образом:

Шаг 1. Проверяем условия сигнала на покупку

          if (FIndicator.GetResultByFieldName('Value')>=0) and
            (FIndicator.GetResultByFieldNameAndIndex('Value',FIndicator.PriceSource.CurrentItemIndex-LastCandleIndex)<0) then

Если это условие выполняется, то считаем, что это сигнал на покупку и завершаем подпрограмму:

             FSignalType:=enBuy;
             Result:=true;
             exit;

Шаг 2. Проверяем условия сигнала на продажу

         if (FIndicator.GetResultByFieldName('Value')<0) and
             (FIndicator.GetResultByFieldNameAndIndex('Value',FIndicator.PriceSource.CurrentItemIndex-LastCandleIndex)>=0) then

Если это условие выполняется, то считеам, что это сигнал на продажу и выходим из подпрограммы:

            FSignalType:=enSell;
            Result:=true;
            exit;

Шаг 3. Если у нас не последняя котировка, то переносим указатель на следующую котировку и повторяем цикл, начина с шага 1 (выполняем еще раз то, что находится между операторами repeat ... until

Как мы ищем обратный сигнал? Сперва запоминаем тип последнего сигнала и проверяем, не последняя ли у нас котировка:

    LastSignalType:=FSignalType;
    toNext:=true;
    if not(FIndicator.PriceSource.NextItem) then

Затем в цикле ищем сигнал, не найдя которого решаем, что у нас нет обратного сигнала:

    repeat
        if not FindSignal then
        begin
           Result:=false;
           exit;
        end;

обратным считаем только тот сигнал, который обратный последнему (для покупки - это продажа, для продажи - это покупка):

        if (LastSignalType=enBuy) and (FSignalType=enSell) then
        begin
          Result:=true;
          exit;
        end;
        if (LastSignalType=enSell) and (FSignalType=enBuy) then
        begin
           Result:=true;
           exit;
        end;

Ну, и наконец, цикл мы повторяем до тех пор, пока не просмотрели все котировки до конца (либо пока не нашли сигнал):

   until toNext;

в принципе, метод FindSignalRotate следовало бы объявить в классе TPASSStatAnalizTemplate, потому что он будет одинаков, скорее всего, для всех типов механических торговых систем. Но сейчас мы не будем ничего переписывать, оптимизацией программы займемся, когда будем делать рефакторинг кода. А пока будем продолжать писать классы, сейчас нам надо создать что то, что позволит протестировать статистический анализатор котировок.

TPASSStatStoreDataList=class(TPASSStatStoreDataTemplate)
protected
   FList:TStrings;
   FCounter:integer;
public
   constructor Create(AList:TStrings);
   procedure AddData(AParameters:TPASSParameters); override;
end;

Как видим, данный класс очень простой. Он предназначен лишь для того, что бы показать пользователю результаты первичного статистического анализа. Реализовов его, мы сможем проверить, правильно ли у нас работает класс TPASSStatAnalizMomentum:

constructor TPASSStatStoreDataList.Create(AList:TStrings);
begin
   inherited Create;
   FList:=AList;
   FCounter:=0;
end;

procedure TPASSStatStoreDataList.AddData(AParameters:TPASSParameters);
var s:string; i,cn:integer;
begin
   s:='';
   cn:=AParameters.Count-1;
   for i:=0 to cn do s:=s+AParameters[i].Name+'='+AParameters.AsStringByNum(i)+';';
   FList.Add(s);
   FCounter:=FCounter+1;
end;

Метод AddData класса TPASSStatStoreDataList простотупо и решительно все параметры засовывает в строку и добавляет в список строк. Этого нам достаточно, что бы отобразить результаты расчетов на экране. На следующем уроке мы этим и займемся. А сейчас мы реализуем последний метод, который еще не реализовали:

procedure TPASSStatAnalizMomentum.Test;
begin
    FIndicator.PriceSource.CurrentItemIndex:=FIndicator.GetParameterByName('DT')+3;
    inherited Test;
end;
Последнее обновление ( 17.08.2011 г. )
 
« След.   Пред. »
 
© 2018 Программирование - это просто
Joomla! - свободное программное обеспечение, распространяемое по лицензии GNU/GPL.
Русская локализация © 2005-2008 Joom.Ru - Русский Дом Joomla!
Design by Mamboteam.com | Powered by Mambobanner.de
Я принимаю Яндекс.Деньги
Мы принимаем
Банковские карты
Оплатите покупку в интернет-магазине банковскими картами VISA и Mastercard любого банка.
узнать больше
Электронный кошелек
Моментальная оплата покупок с помощью вашего электронного кошелька RBK Money.
узнать больше
Банковский платеж
Оплатите покупку в любом российском банке. Срок зачисления средств на счет - 3-5 рабочих дней.
узнать больше
Денежные переводы
Оплата покупок через крупнейшие системы денежных переводов CONTACT и Unistream.
узнать больше
Почтовые переводы
Оплатите покупку в любом отделении Почты России. Срок зачисления платежа - 3-4 рабочих дня.
узнать больше
Платежные терминалы
Оплата покупок в терминалах крупнейших платежных систем в любом городе России - быстро и без комиссии.
узнать больше