SMAStrategy Подрихтовал немножко

Индикаторы, написанные участниками форума. Делимся своими наработками.
Ответить
Сообщение
Автор
Евгений
Сообщения: 34
Зарегистрирован: Вс авг 06, 2006 1:46 pm

SMAStrategy Подрихтовал немножко

#1 Сообщение Евгений » Чт авг 31, 2006 12:58 pm

Просто добавил возможность установки лося и профита :wink: 8)

Код: Выделить всё

//-------------------------------------------------------------------------
// Example of strategy based on 2 crossing SMA (c) Koshelev M.A.
// Поправлено Евгением ;)
//-------------------------------------------------------------------------
library SMAStrategy;

uses

  SysUtils, Classes, StrategyInterfaceUnit;

var
  // Внешние параметры
  Currency: PChar = nil;
  TimeFrame: integer;
  LotSize: double;
  StopLoss: double;
  TakeProfit: double;
  period1: integer;
  period2: integer;
  LossSize: integer;
  ProfitSize: integer;

  // Внутренние переменные
  OrderHandle: integer;
  OrderStyle: TTradePositionType;
  OpenTime: TDateTime;

//--------------------------------------
// инициализация
//--------------------------------------

procedure InitStrategy; stdcall;

begin
  StrategyShortName('SimpleSMA');
  StrategyDescription('Стратегия по пересечению 2х SMA');
  // регистрация внешних параметров
  RegOption('Currency', ot_Currency, Currency);
  ReplaceStr(Currency, 'EURUSD');
  RegOption('Timeframe', ot_Timeframe, TimeFrame);
  TimeFrame := PERIOD_H1;
  RegOption('LotSize', ot_Double, LotSize);
  SetOptionDigits('LotSize', 1);
  lotSize := 0.1;
  RegOption('SMA1 period', ot_Integer, period1);
  SetOptionRange('SMA1 period', 2, MaxInt);
  period1 := 16;
  RegOption('SMA2 period', ot_Integer, period2);
  SetOptionRange('SMA2 period', 2, MaxInt);
  period2 := 32;
  RegOption('StopLoss', ot_Integer, LossSize);
  SetOptionRange('StopLoss', 0, MaxInt);
  LossSize := 30;
  RegOption('TakeProfit', ot_Integer, ProfitSize);
  SetOptionRange('TakeProfit', 0, MaxInt);
  ProfitSize := 50;
end;

//--------------------------------------
// деинициализация
//--------------------------------------

procedure DoneStrategy; stdcall;

begin
  FreeMem(Currency);    // освободить строку PChar
end;

//--------------------------------------
// сбросить временные параметры
//--------------------------------------

procedure ResetStrategy; stdcall;

begin
  OrderHandle := -1;
end;

// рассчет SMA
function GetSMA(period: integer): double;
var
  i: integer;
  sum: double;
begin
  sum := 0;
  for i:=0 to period - 1 do
    sum := sum + Close(i);
  result := sum/period;
end;

//---------------------------------------
// Обработать тик
//---------------------------------------

procedure GetSingleTick; stdcall;

var

  sma1, sma2: double;

begin

  // проверка валюты

  if Symbol <> string(Currency) then exit;

  // установить валюту и таймфрейм

  SetCurrencyAndTimeframe(Symbol, TimeFrame);

  // проверка числа баров

  if (Bars < period1) or (Bars < period2) then exit;

  // рассчет SMA

  sma1 := GetSMA(period1);

  sma2 := GetSMA(period2);

  // если ордер открыт на покупку и быстрая sma1 пересекает sma2

  // сверху вниз и прошли как минимум 1 бар то закрыть ордер

  if (OrderHandle <> -1) and (OrderStyle = tp_Buy) and

     (OpenTime <> Time(0)) and (sma1 < sma2) then

    begin

      CloseOrder(OrderHandle);

      OrderHandle := -1;

    end;

  // если ордер открыт на продажу и быстрая sma1 пересекает sma2

  // снизу вверх и прошли как минимум 1 бар то закрыть ордер

  if (OrderHandle <> -1) and (OrderStyle = tp_Sell) and

     (OpenTime <> Time(0)) and (sma1 > sma2) then

    begin

      CloseOrder(OrderHandle);

      OrderHandle := -1;

    end;

  // если нет ордеров и быстрая sma1 пересекает sma2

  // сверху вниз то открыть ордер на продажу

  if (OrderHandle = -1) and (sma1 < sma2) then

    begin

      StopLoss := Bid + LossSize*Point;
      TakeProfit := Bid - ProfitSize*Point;
      SendInstantOrder(Symbol, op_Sell, LotSize, StopLoss, TakeProfit, OrderHandle);
      OrderStyle := tp_Sell;
      OpenTime := Time(0);

    end;

  // если нет ордеров и быстрая sma1 пересекает sma2
  // снизу вверх то открыть ордер на покупку

  if (OrderHandle = -1) and (sma1 > sma2) then

    begin

      StopLoss := Ask - LossSize*Point;
      TakeProfit := Ask + ProfitSize*Point;
      SendInstantOrder(Symbol, op_Buy, LotSize, StopLoss, TakeProfit, OrderHandle);
      OrderStyle := tp_Buy;
      OpenTime := Time(0);

    end;
end;

exports

InitStrategy, DoneStrategy, ResetStrategy, GetSingleTick;

end.

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

Re: SMAStrategy Подрихтовал немножко

#2 Сообщение Terranin » Чт авг 31, 2006 3:46 pm

Евгений писал(а):Просто добавил возможность установки лося и профита :wink: 8)
Это всегда пожалуйста. Просто эта стратегия была как пример написания и сильно усложнять я ее не стал.

Евгений
Сообщения: 34
Зарегистрирован: Вс авг 06, 2006 1:46 pm

Re: SMAStrategy Подрихтовал немножко

#3 Сообщение Евгений » Пт сен 01, 2006 1:52 am

Terranin писал(а):Это всегда пожалуйста. Просто эта стратегия была как пример написания и сильно усложнять я ее не стал.
Да я так просто из учебных целей изучал как стратегию писать :? Хотя даже в стандартном варианте (без возможности установки профитов)при СМА1=39 СМА2=20 наколбасила вчера по фунту на майских данных 130% профита :lol: :lol: :lol: Жаль времени нету на остальной истории прогнать интересно что бы было :?:

Vander
Сообщения: 10
Зарегистрирован: Вс ноя 26, 2006 8:31 am
Контактная информация:

#4 Сообщение Vander » Чт янв 18, 2007 2:13 pm

А дальше будет лось! :) :lol:

-=LP=-
Сообщения: 14
Зарегистрирован: Пн янв 22, 2007 11:42 am

#5 Сообщение -=LP=- » Пн янв 22, 2007 11:50 am

Здравствуйте! У меня вопрос. Я открываю Delphi 7 копирую код написаный Евгением, жму компилить а мне пишет:
[Error] SMA.dpr(163): Incompatible types: 'String' and 'Integer'
[Error] SMA.dpr(178): Incompatible types: 'String' and 'Integer'

Ошибка указывает на строки:
SendInstantOrder(Symbol, op_Sell, LotSize, StopLoss, TakeProfit, OrderHandle);
SendInstantOrder(Symbol, op_Buy, LotSize, StopLoss, TakeProfit, OrderHandle);

Тоже самое с исходной стратегией написаной автором Forex Tester'а.
Подскажите че это такое?! :shock:

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

#6 Сообщение Terranin » Пн янв 22, 2007 3:16 pm

-=LP=- писал(а):Здравствуйте! У меня вопрос. Я открываю Delphi 7 копирую код написаный Евгением, жму компилить а мне пишет:
[Error] SMA.dpr(163): Incompatible types: 'String' and 'Integer'
[Error] SMA.dpr(178): Incompatible types: 'String' and 'Integer'

Ошибка указывает на строки:
SendInstantOrder(Symbol, op_Sell, LotSize, StopLoss, TakeProfit, OrderHandle);
SendInstantOrder(Symbol, op_Buy, LotSize, StopLoss, TakeProfit, OrderHandle);

Тоже самое с исходной стратегией написаной автором Forex Tester'а.
Подскажите че это такое?! :shock:
Изменился формат этих процедур, добавились комментарии и MagicNumber.Теперь надо так
SendInstantOrder(Symbol, op_Sell, LotSize, StopLoss, TakeProfit, '', 0, OrderHandle);
Asta la vista
Mike

-=LP=-
Сообщения: 14
Зарегистрирован: Пн янв 22, 2007 11:42 am

#7 Сообщение -=LP=- » Пн янв 22, 2007 3:36 pm

Terranin писал(а):Изменился формат этих процедур, добавились комментарии и MagicNumber.Теперь надо так
SendInstantOrder(Symbol, op_Sell, LotSize, StopLoss, TakeProfit, '', 0, OrderHandle);
Спасибо! :wink:

Ответить