Страница 1 из 2

Переведем куски MQL4 в Delphi

Добавлено: Пт дек 01, 2006 9:29 pm
HIDDEN ™
Во многих своих стратегиях при написании экспертов я использую вот такой расчет рабочего лота. Это наиболее точный расчет лота, есть много вариантов, мне нравится именно этот.

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

int LotCalc(){
   GetMarketInfo();   // Sum of the calculation
   double S;          // Cost of the lot
   double L;          // Lot quantity
   double k;          // Cost of one pip
   if( AutoLots == true ){
       if(SymbolsCount != OrdersTotal()){
           S = (AccountBalance()* Risk - AccountMargin()) * AccountLeverage() / (SymbolsCount - OrdersTotal());
         } else {
           S = 0;
         }
       // We check, does currency appear to be EURUSD?
       if(StringFind( Symbol(), "USD") == -1){
           if(StringFind( Symbol(), "EUR") == -1){
               S = 0;
             } else {
               S = S / iClose ("EURUSD", 0, 0);
               if(StringFind( Symbol(), "EUR") != 0){
                  S /= Bid;
                  }
             }
         } else {
           if(StringFind(Symbol(), "USD") != 0){
               S /= Bid;
             }
         }
       S /= ModeLotSize;
       S -= ModeMinLot;
       S /= ModeLotStep;
       S = NormalizeDouble(S, 0);
       S *= ModeLotStep;
       S += ModeMinLot;
       Lots = S;
       if (Lots<ModeMinLot){ Lots=ModeMinLot; }
       if (Lots>ModeMaxLot){ Lots=ModeMaxLot; }
     }
   return(0);
}
Соответственно вопрос как его запрограммировать в DLL

Re: Переведем куски MQL4 в Delphi

Добавлено: Пт дек 01, 2006 11:25 pm
Terranin
HIDDEN ™ писал(а):Во многих своих стратегиях при написании экспертов я использую вот такой расчет рабочего лота. Это наиболее точный расчет лота, есть много вариантов, мне нравится именно этот.

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

int LotCalc(){
   GetMarketInfo();   // Sum of the calculation
   double S;          // Cost of the lot
   double L;          // Lot quantity
   double k;          // Cost of one pip
   if( AutoLots == true ){
       if(SymbolsCount != OrdersTotal()){
           S = (AccountBalance()* Risk - AccountMargin()) * AccountLeverage() / (SymbolsCount - OrdersTotal());
         } else {
           S = 0;
         }
       // We check, does currency appear to be EURUSD?
       if(StringFind( Symbol(), "USD") == -1){
           if(StringFind( Symbol(), "EUR") == -1){
               S = 0;
             } else {
               S = S / iClose ("EURUSD", 0, 0);
               if(StringFind( Symbol(), "EUR") != 0){
                  S /= Bid;
                  }
             }
         } else {
           if(StringFind(Symbol(), "USD") != 0){
               S /= Bid;
             }
         }
       S /= ModeLotSize;
       S -= ModeMinLot;
       S /= ModeLotStep;
       S = NormalizeDouble(S, 0);
       S *= ModeLotStep;
       S += ModeMinLot;
       Lots = S;
       if (Lots<ModeMinLot){ Lots=ModeMinLot; }
       if (Lots>ModeMaxLot){ Lots=ModeMaxLot; }
     }
   return(0);
}
Соответственно вопрос как его запрограммировать в DLL
В АПИ есть функции:
OrdersTotal
Symbol
AccountBalance
AccountMargin
AccountLeverage

и они выполняют теже функции что и в MQL4 (см. хелп по стратегиям)
минимальный лот 0.1
нет функции SymbolsCount

все остальное можно рассчитать так же как и в приведенном коде

Re: Переведем куски MQL4 в Delphi

Добавлено: Сб дек 02, 2006 7:29 am
HIDDEN ™
Странно но у меня в Delphi 7 не компилится в DLL стратегия приведенная в примерах, я добавил в нее только трал из соседней ветки. В чем проблема?

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

//-------------------------------------------------------------------------
// Example of strategy based on 2 crossing SMA (c) Koshelev M.A.
//-------------------------------------------------------------------------
library SMAStrategy;

uses
  SysUtils,  Classes,  StrategyInterfaceUnit, Math;

var
  // External parameters
  Currency: PChar = nil;
  TimeFrame: integer;
  LotSize: double;
  period1: integer;
  period2: integer;

  // custom variables
  OrderHandle: integer;
  OrderStyle: TTradePositionType;
  OpenTime: TDateTime;

  // TrailingStop
  TrailingStop: integer;
  TrailingStep: integer;
{-----Init strategy---------------------------------------------------------}
procedure InitStrategy; stdcall;
begin
  StrategyShortName('SimpleSMA');
  StrategyDescription('Strategy based on 2 SMA');

  // Register external parameters
  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('TrailingStop', ot_integer,TrailingStop); 
  SetOptionRange('TrailingStop',0,100);
  TrailingStop:=20;

  RegOption('TrailingStep', ot_integer,TrailingStep);
  SetOptionRange('TrailingStep',0,100);
  TrailingStep:=1;
end;

{-----Done strategy---------------------------------------------------------}
procedure DoneStrategy; stdcall;
begin
  FreeMem(Currency);  
end;

{-----Reset strategy--------------------------------------------------------}
procedure ResetStrategy; stdcall;
begin
  OrderHandle := -1;
end;

{-----Calculate 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;

{-----Process single tick---------------------------------------------------}
procedure GetSingleTick; stdcall;
var
  sma1, sma2: double;
begin
  // check our currency
  if Symbol <> string(Currency) then exit;

  // set currency and timeframe
  SetCurrencyAndTimeframe(Symbol, TimeFrame);

  // check number of bars and SMA period
  if (Bars < period1) or (Bars < period2) then exit;

  // calculate SMA
  sma1 := GetSMA(period1);
  sma2 := GetSMA(period2);

  // if BUY order exists and fast SMA crosses slow SMA from top 
  // then close order
  if (OrderHandle <> -1) and (OrderStyle = tp_Buy) and
     (OpenTime <> Time(0)) and (sma1 < sma2) then
    begin
      CloseOrder(OrderHandle);
      OrderHandle := -1;
    end;

  // if SELL order exists and fast SMA crosses slow SMA from bottom
  // then close order
  if (OrderHandle <> -1) and (OrderStyle = tp_Sell) and
     (OpenTime <> Time(0)) and (sma1 > sma2) then
    begin
      CloseOrder(OrderHandle);
      OrderHandle := -1;
    end;

  // if there is no order and fast SMA crosses slow SMA from top
  // then open SELL order
  if (OrderHandle = -1) and (sma1 < sma2) then
    begin
      SendInstantOrder(Symbol, op_Sell, LotSize, 0, 0, OrderHandle);
      OrderStyle := tp_Sell;
      OpenTime := Time(0);
    end;

  // if there is no order and fast SMA crosses slow SMA from bottom 
  // then open BUY order
  if (OrderHandle = -1) and (sma1 > sma2) then
    begin
      SendInstantOrder(Symbol, op_Buy, LotSize, 0, 0, OrderHandle);
      OrderStyle := tp_Buy;
      OpenTime := Time(0);
    end;
end;

Procedure TS; 
var i:integer; 
begin 
  if OrdersTotal>0 then 
  for i:=0  to OrdersTotal do 
{1} begin 
  OrderSelect(i,SELECT_BY_POS,MODE_TRADES); 
      if (OrderType=tp_Buy) then 
      begin 
      if (OrderStopLoss=0) and (Bid-OrderOpenPrice>TrailingStop*Point) then  ModifyOrder(OrderTicket,OrderOpenPrice,Bid-TrailingStop*Point,0); 
      if (OrderStopLoss>0)  and (RoundTo(Bid-TrailingStop*Point,-4)>RoundTo(OrderStopLoss,-4)) then 
        begin 
        if Bid-OrderStoploss>(TrailingStop+TrailingStep)*Point then   ModifyOrder(OrderTicket,OrderOpenPrice,Bid-TrailingStop*Point,0); 
        end; 
      end; 
      if  (OrderType=tp_Sell) then 
      begin 
      if (OrderStopLoss=0) and (OrderOpenPrice-Ask>Trailingstop*Point) then   ModifyOrder(OrderTicket,OrderOpenPrice,Ask+TrailingStop*Point,0); 
      if (OrderStopLoss>0)  and (RoundTo(Ask+TrailingStop*Point,-4)< RoundTo(OrderStopLoss,-4)) then 
        begin 
        if (OrderStopLoss-Ask)>(TrailingStop+TrailingStep)*Point then   ModifyOrder(OrderTicket,OrderOpenPrice,Ask+TrailingStop*Point,0); 
        end; 
      end; 
{1} end; 
end;

exports

InitStrategy, 
DoneStrategy, 
ResetStrategy, 
GetSingleTick;

end.
Выдает следующие
Компоновка
[Ошибка] SMAStrategy.dpr(123): Incompatible types: 'String' and 'Integer'
[Ошибка] SMAStrategy.dpr(132): Incompatible types: 'String' and 'Integer'

Вот в этом куске кода

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

if (OrderHandle = -1) and (sma1 < sma2) then
    begin
      [b]SendInstantOrder(Symbol, op_Sell, LotSize, 0, 0, OrderHandle);[/b]
      OrderStyle := tp_Sell;
      OpenTime := Time(0);
    end;

  // if there is no order and fast SMA crosses slow SMA from bottom
  // then open BUY order
  if (OrderHandle = -1) and (sma1 > sma2) then
    begin
      [b]SendInstantOrder(Symbol, op_Buy, LotSize, 0, 0, OrderHandle);[/b]
      OrderStyle := tp_Buy;
      OpenTime := Time(0);
    end;
Кстате и в предыдущих билдах тоже не компилилилась стратегия.
Может у меня что-то еще не доустановленно? Но помоему проблема не в этом.

Добавлено: Сб дек 02, 2006 8:42 am
HIDDEN ™
Спрошу ради интереса. А саму стратегию написанную в DLL в последствии можно будет применить в MQL4, как внешнюю функцию, ну и соответственно будит ли она торговать в MetaTreder 4

Добавлено: Сб дек 02, 2006 11:48 am
HIDDEN ™
Итак читая справку делая все по порядку, решил написать стратегию по индикатору WPR.

Все просто если показания индикатора опускается ниже -50 продаём и если выше -50 покупаем, с закрытием все наоборот т.е. если поднялись выше -50 то закрываем SELL, если опустились ниже -50 то закрываем BUY.

Код привожу ниже. Все компилится все путем, но сделки не открываются, помогите разобраться что я не так написал в коде или что конкретно не работает.

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

library test;

uses
  SysUtils,
  Classes,
  StrategyInterfaceUnit,
  Math,
  TechnicalFunctions;

var
  // External parameters
  Currency: PChar = nil;
  TimeFrame: integer;
  LotSize: double;
  period: integer;
  Symbol: string;
  MagicNumber: integer;
  iEURUSD: integer;
  // custom variables
  OrderHandle: integer;
  OrderStyle: TTradePositionType;
  OpenTime: TDateTime;
  // TrailingStop
  TrailingStop: integer;
  TrailingStep: integer;
{-----Init strategy---------------------------------------------------------}
procedure InitStrategy; stdcall;
begin
  StrategyShortName('test');
  StrategyDescription('WPR R%');

  // Register external parameters
  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('WPR period', ot_Integer, period);
  SetOptionRange('WPR period', 2, MaxInt);
  period := -50;

  RegOption('MagicNumber', ot_integer,MagicNumber);
  SetOptionRange('MagicNumber',0,100);
  MagicNumber:=20061201;

  RegOption('TrailingStop', ot_integer,TrailingStop);
  SetOptionRange('TrailingStop',0,100);
  TrailingStop:=20;

  RegOption('TrailingStep', ot_integer,TrailingStep);
  SetOptionRange('TrailingStep',0,100);
  TrailingStep:=10;
end;

{-----Done strategy---------------------------------------------------------}
procedure DoneStrategy; stdcall;
begin
  FreeMem(Currency);  
end;

{-----Reset strategy--------------------------------------------------------}
procedure ResetStrategy; stdcall;
begin
  OrderHandle := -1;
  iEURUSD := CreateIndicator(Symbol, PERIOD_H1, 'WPR', '14;Close');
end;

{-----Process single tick---------------------------------------------------}
procedure GetSingleTick; stdcall;
var
  iWPR: double;
begin
  // check our currency
  if Symbol <> string(Currency) then exit;

  // set currency and timeframe
  SetCurrencyAndTimeframe(Symbol, TimeFrame);

  // calculate WPR
  iWPR := GetIndicatorValue(iEURUSD, 0, 0);

  // if BUY order exists and fast SMA crosses slow SMA from top
  // then close order
  if (OrderHandle <> -1) and (OrderStyle = tp_Buy) and
     (OpenTime <> Time(0)) and (iWPR < period) then
    begin
      CloseOrder(OrderHandle);
      OrderHandle := -1;
    end;

  // if SELL order exists and fast SMA crosses slow SMA from bottom
  // then close order
  if (OrderHandle <> -1) and (OrderStyle = tp_Sell) and
     (OpenTime <> Time(0)) and (iWPR > period) then
    begin
      CloseOrder(OrderHandle);
      OrderHandle := -1;
    end;

  // if there is no order and fast SMA crosses slow SMA from top
  // then open SELL order
  if (OrderHandle = -1) and (iWPR < period) then
    begin
      SendInstantOrder(Symbol, op_Sell, LotSize, 0, 0, '', MagicNumber, OrderHandle);
      OrderStyle := tp_Sell;
      OpenTime := Time(0);
    end;

  // if there is no order and fast SMA crosses slow SMA from bottom
  // then open BUY order
  if (OrderHandle = -1) and (iWPR > period) then
    begin
      SendInstantOrder(Symbol, op_Buy, LotSize, 0, 0, '', MagicNumber, OrderHandle);
      OrderStyle := tp_Buy;
      OpenTime := Time(0);
    end;
end;

Procedure TS; 
var i:integer; 
begin 
  if OrdersTotal>0 then 
  for i:=0  to OrdersTotal do
{1} begin 
  OrderSelect(i,SELECT_BY_POS,MODE_TRADES); 
      if (OrderType=tp_Buy) then 
      begin 
      if (OrderStopLoss=0) and (Bid-OrderOpenPrice>TrailingStop*Point) then  ModifyOrder(OrderTicket,OrderOpenPrice,Bid-TrailingStop*Point,0); 
      if (OrderStopLoss>0)  and (RoundTo(Bid-TrailingStop*Point,-4)>RoundTo(OrderStopLoss,-4)) then
        begin 
        if Bid-OrderStoploss>(TrailingStop+TrailingStep)*Point then   ModifyOrder(OrderTicket,OrderOpenPrice,Bid-TrailingStop*Point,0); 
        end; 
      end; 
      if  (OrderType=tp_Sell) then 
      begin 
      if (OrderStopLoss=0) and (OrderOpenPrice-Ask>Trailingstop*Point) then   ModifyOrder(OrderTicket,OrderOpenPrice,Ask+TrailingStop*Point,0); 
      if (OrderStopLoss>0)  and (RoundTo(Ask+TrailingStop*Point,-4)< RoundTo(OrderStopLoss,-4)) then
        begin 
        if (OrderStopLoss-Ask)>(TrailingStop+TrailingStep)*Point then   ModifyOrder(OrderTicket,OrderOpenPrice,Ask+TrailingStop*Point,0); 
        end; 
      end; 
{1} end; 
end;

exports

InitStrategy, 
DoneStrategy, 
ResetStrategy, 
GetSingleTick;

end.

Re: Переведем куски MQL4 в Delphi

Добавлено: Сб дек 02, 2006 5:29 pm
Terranin
HIDDEN ™ писал(а):Странно но у меня в Delphi 7 не компилится в DLL стратегия приведенная в примерах, я добавил в нее только трал из соседней ветки. В чем проблема?

Кстате и в предыдущих билдах тоже не компилилилась стратегия.
Может у меня что-то еще не доустановленно? Но помоему проблема не в этом.
Забыл обновить код стратегии, там слегка изменились интерфейсные функции установки ордеров. Добавился MagicNumber и Comment.

Добавлено: Сб дек 02, 2006 5:31 pm
Terranin
HIDDEN ™ писал(а):Спрошу ради интереса. А саму стратегию написанную в DLL в последствии можно будет применить в MQL4, как внешнюю функцию, ну и соответственно будит ли она торговать в MetaTreder 4
Не получится. Из dll нельзя будет выставлять ордера. Да и с изменением переменных из длл они тоже нахомутали, можно только что-то в длл передать а получить обратно у меня не вышло.

Добавлено: Сб дек 02, 2006 5:34 pm
Terranin
HIDDEN ™ писал(а):Итак читая справку делая все по порядку, решил написать стратегию по индикатору WPR.

Все просто если показания индикатора опускается ниже -50 продаём и если выше -50 покупаем, с закрытием все наоборот т.е. если поднялись выше -50 то закрываем SELL, если опустились ниже -50 то закрываем BUY.

Код привожу ниже. Все компилится все путем, но сделки не открываются, помогите разобраться что я не так написал в коде или что конкретно не работает.
Я сейчас убегаю некогда смотреть, советую обратить внимание на функции для дебага: Print и Breakpoint.
Возможно не создается индикатор - надо проверить возвращаемый хэндл, разрешена ли работа стратегии - посмотри помечена ли она галочкой в списке стратегий. Также если что не так - все пишется в журнал.

Добавлено: Сб дек 02, 2006 7:09 pm
HIDDEN ™
Terranin писал(а):
HIDDEN ™ писал(а):Итак читая справку делая все по порядку, решил написать стратегию по индикатору WPR.

Все просто если показания индикатора опускается ниже -50 продаём и если выше -50 покупаем, с закрытием все наоборот т.е. если поднялись выше -50 то закрываем SELL, если опустились ниже -50 то закрываем BUY.

Код привожу ниже. Все компилится все путем, но сделки не открываются, помогите разобраться что я не так написал в коде или что конкретно не работает.
Я сейчас убегаю некогда смотреть, советую обратить внимание на функции для дебага: Print и Breakpoint.
Возможно не создается индикатор - надо проверить возвращаемый хэндл, разрешена ли работа стратегии - посмотри помечена ли она галочкой в списке стратегий. Также если что не так - все пишется в журнал.
Индикатор создаётся, галки и настройки все стоят, а что не торгует не понятно, кстате с маджиком и коментом тоже разобрался вставил куда нужно.

Добавлено: Вс дек 03, 2006 5:36 am
Terranin
HIDDEN ™ писал(а):
Terranin писал(а):
HIDDEN ™ писал(а):Итак читая справку делая все по порядку, решил написать стратегию по индикатору WPR.

Все просто если показания индикатора опускается ниже -50 продаём и если выше -50 покупаем, с закрытием все наоборот т.е. если поднялись выше -50 то закрываем SELL, если опустились ниже -50 то закрываем BUY.

Код привожу ниже. Все компилится все путем, но сделки не открываются, помогите разобраться что я не так написал в коде или что конкретно не работает.
Я сейчас убегаю некогда смотреть, советую обратить внимание на функции для дебага: Print и Breakpoint.
Возможно не создается индикатор - надо проверить возвращаемый хэндл, разрешена ли работа стратегии - посмотри помечена ли она галочкой в списке стратегий. Также если что не так - все пишется в журнал.
Индикатор создаётся, галки и настройки все стоят, а что не торгует не понятно, кстате с маджиком и коментом тоже разобрался вставил куда нужно.
Тогда пиши в лог с помощью Print(), например проверь сначала проходит ли тест валюты, вообще там достаточно
if Symbol <> Currency then exit;

потом поставь Print после получения значения индикатора проверить какие ты значения получаешь.

если ок, ставь Print после условий и смотри попадаешь ты туда вообще или нет.

Добавлено: Пт дек 08, 2006 7:04 pm
HIDDEN ™
Terranin писал(а):Тогда пиши в лог с помощью Print(), например проверь сначала проходит ли тест валюты, вообще там достаточно
if Symbol <> Currency then exit;

потом поставь Print после получения значения индикатора проверить какие ты значения получаешь.

если ок, ставь Print после условий и смотри попадаешь ты туда вообще или нет.
Ставлю Print() в тех местах где хочу проверить передаютля ли парраметры, так не компилится DLL. Выдаёт следующее.

[Ошибка] Strategy.dpr(120): Not enough actual parameters

ну никак не получается у меня.

Можно я вышлю код тебе на почту, посмотришь подскажешь, очень проверить нужно алгоритм.

Добавлено: Пт дек 08, 2006 7:10 pm
Terranin
HIDDEN ™ писал(а):
Terranin писал(а):Тогда пиши в лог с помощью Print(), например проверь сначала проходит ли тест валюты, вообще там достаточно
if Symbol <> Currency then exit;

потом поставь Print после получения значения индикатора проверить какие ты значения получаешь.

если ок, ставь Print после условий и смотри попадаешь ты туда вообще или нет.
Ставлю Print() в тех местах где хочу проверить передаютля ли парраметры, так не компилится DLL. Выдаёт следующее.

[Ошибка] Strategy.dpr(120): Not enough actual parameters

ну никак не получается у меня.

Можно я вышлю код тебе на почту, посмотришь подскажешь, очень проверить нужно алгоритм.
Ну ок высылай. А в Print надо же че-то передавать :) например Print('я тута');

Добавлено: Пт дек 08, 2006 7:26 pm
HIDDEN ™
отправил в личку

Добавлено: Пт дек 08, 2006 8:43 pm
Terranin
HIDDEN ™ писал(а):отправил в личку
Уфф, много ошибок, разбираюсь. :) Сразу одна главная - ты объявил глобальную переменную Symbol которая перекрыла функцию Symbol которая возвращала текущую валюту. Теперь у тебя валюта постоянна = пустой строке и ты вообще не попадаешь в процедуру обработки по этому условию:

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

  // check our currency
  if Symbol <> string(Currency) then exit;
это условие кстати можно записать как

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

  if Symbol <> Currency then exit;
Такая строка некорректна

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

  if Symbol > 'USD' then ...
надо писать

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

  if copy(Symbol, 1, 3) <> 'USD' then ...
Эти вызовы Print не пишут ничего кроме того что в скобках

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

  Print('iWPRGBPUSD');
  Print('iWPREURUSD');
Если надо вывести значение то нужно его преобразовать в строку, например:

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

  Print(format('Это наш WPR: %.4f', [iWPRGBPUSD]));
%.4f - указывает вывести число с плавающей точкой с 4 знаками после запятой
%d - вывести целое
%s - вывести строку

Добавлено: Пт дек 08, 2006 8:49 pm
HIDDEN ™
Terranin писал(а):
HIDDEN ™ писал(а):отправил в личку
Уфф, много ошибок, разбираюсь. :) Сразу одна главная - ты объявил глобальную переменную Symbol которая перекрыла функцию Symbol которая возвращала текущую валюту. Теперь у тебя валюта постоянна = пустой строке и ты вообще не попадаешь в процедуру обработки по этому условию:

// check our currency
if Symbol <> string(Currency) then exit;

это условие кстати можно записать как

if Symbol <> Currency then exit;

Такая строка некорректна

if Symbol > 'USD' then ...

надо писать

if copy(Symbol, 1, 3) <> 'USD' then ...
Интересно, обезательно детально все изучу, кстате справку читал, примеры смотрел, примеры я так понимаю нужно обновить, там много чего видемо некоректного.

А так вообще на верном пути, первый раз пишк ведь.

Добавлено: Пт дек 08, 2006 8:49 pm
HIDDEN ™
Terranin писал(а):
HIDDEN ™ писал(а):отправил в личку
Уфф, много ошибок, разбираюсь. :) Сразу одна главная - ты объявил глобальную переменную Symbol которая перекрыла функцию Symbol которая возвращала текущую валюту. Теперь у тебя валюта постоянна = пустой строке и ты вообще не попадаешь в процедуру обработки по этому условию:

// check our currency
if Symbol <> string(Currency) then exit;

это условие кстати можно записать как

if Symbol <> Currency then exit;

Такая строка некорректна

if Symbol > 'USD' then ...

надо писать

if copy(Symbol, 1, 3) <> 'USD' then ...
Интересно, обезательно детально все изучу, кстате справку читал, примеры смотрел, примеры я так понимаю нужно обновить, там много чего видемо некоректного.

А так вообще на верном пути, первый раз пишк ведь.

Добавлено: Пт дек 08, 2006 8:54 pm
Terranin
HIDDEN ™ писал(а):
Terranin писал(а):
HIDDEN ™ писал(а):отправил в личку
Уфф, много ошибок, разбираюсь. :) Сразу одна главная - ты объявил глобальную переменную Symbol которая перекрыла функцию Symbol которая возвращала текущую валюту. Теперь у тебя валюта постоянна = пустой строке и ты вообще не попадаешь в процедуру обработки по этому условию:

// check our currency
if Symbol <> string(Currency) then exit;

это условие кстати можно записать как

if Symbol <> Currency then exit;

Такая строка некорректна

if Symbol > 'USD' then ...

надо писать

if copy(Symbol, 1, 3) <> 'USD' then ...
Интересно, обезательно детально все изучу, кстате справку читал, примеры смотрел, примеры я так понимаю нужно обновить, там много чего видемо некоректного.

А так вообще на верном пути, первый раз пишк ведь.
Да все понятно ;) я там пост еще подновил свой. Надо браться за перевод АПИ на С++ тогда куски MQL можно будет копировать и даже замахнуться на автоматический транслятор... Плохо что я С++ знаю фигово и никогда не пользовался.

Добавлено: Пт дек 08, 2006 8:57 pm
HIDDEN ™
Terranin писал(а):
HIDDEN ™ писал(а):
Terranin писал(а): Уфф, много ошибок, разбираюсь. :) Сразу одна главная - ты объявил глобальную переменную Symbol которая перекрыла функцию Symbol которая возвращала текущую валюту. Теперь у тебя валюта постоянна = пустой строке и ты вообще не попадаешь в процедуру обработки по этому условию:

// check our currency
if Symbol <> string(Currency) then exit;

это условие кстати можно записать как

if Symbol <> Currency then exit;

Такая строка некорректна

if Symbol > 'USD' then ...

надо писать

if copy(Symbol, 1, 3) <> 'USD' then ...
Интересно, обезательно детально все изучу, кстате справку читал, примеры смотрел, примеры я так понимаю нужно обновить, там много чего видемо некоректного.

А так вообще на верном пути, первый раз пишк ведь.
Да все понятно ;) я там пост еще подновил свой. Надо браться за перевод АПИ на С++ тогда куски MQL можно будет копировать и даже замахнуться на автоматический транслятор... Плохо что я С++ знаю фигово и никогда не пользовался.
У меня есть человечек один на С++ пишет. Я постараюсь Вас свести вместе.

Добавлено: Ср дек 13, 2006 2:23 pm
wellx
Terranin писал(а):
Да все понятно ;) я там пост еще подновил свой. Надо браться за перевод АПИ на С++ тогда куски MQL можно будет копировать и даже замахнуться на автоматический транслятор... Плохо что я С++ знаю фигово и никогда не пользовался.
Может несколько сместить акценты: язык МТ - подобие С, есть проги C2PAS , может есть смысл ее переделать для конвертации с кода МТ в код паскаля? И вместо С++ уделить внимание поддержке FreePascal для написания индикатора(ов)? В конце концов людям нужен бесплатный открытый инструмент (глупо заставлять иметь Делфи для написания индиаторов и стратегий трейдеров). И сделать это намного быстрее чем портировать с Делфи на С++ (ИМХО).

Добавлено: Чт дек 14, 2006 5:30 pm
Terranin
wellx писал(а):
Terranin писал(а):
Да все понятно ;) я там пост еще подновил свой. Надо браться за перевод АПИ на С++ тогда куски MQL можно будет копировать и даже замахнуться на автоматический транслятор... Плохо что я С++ знаю фигово и никогда не пользовался.
Может несколько сместить акценты: язык МТ - подобие С, есть проги C2PAS , может есть смысл ее переделать для конвертации с кода МТ в код паскаля? И вместо С++ уделить внимание поддержке FreePascal для написания индикатора(ов)? В конце концов людям нужен бесплатный открытый инструмент (глупо заставлять иметь Делфи для написания индиаторов и стратегий трейдеров). И сделать это намного быстрее чем портировать с Делфи на С++ (ИМХО).
Где взять фрипаскаль и c2pas? Но в любом случае апи на С++ тоже нужно.

Добавлено: Пт дек 15, 2006 9:59 am
wellx
Terranin писал(а):
Где взять фрипаскаль и c2pas? Но в любом случае апи на С++ тоже нужно.
www.freepascal.org
www.lazarus.freepascal.org
www.freepascal.ru

c2pas.sourceforge.net
http://www.programmersheaven.com/downlo ... nload.aspx

Добавить функции

Добавлено: Пн дек 18, 2006 2:44 pm
wellx
Можно ли попросить сделать базовую реализацию аналогов МТ функций iLowest, iHighest, iBarshift.

Или пытаться самому создавать файл функций аналогов? Можно, но лучше сделать автору ибо многим надо будет.

Re: Добавить функции

Добавлено: Пн дек 18, 2006 10:37 pm
Terranin
wellx писал(а):Можно ли попросить сделать базовую реализацию аналогов МТ функций iLowest, iHighest, iBarshift.

Или пытаться самому создавать файл функций аналогов? Можно, но лучше сделать автору ибо многим надо будет.
В новом билде постараюсь сделать.

Добавлено: Пн янв 15, 2007 7:40 am
VVV
Люди добрые, помогите перевести вот этот кусок кода. У меня где-то там ошибка, а где не пойму.

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

int start()
  {
   int shift, counted_bars=IndicatorCounted();
     
   if ( BarsNumber > 0 ) int Nbars=BarsNumber; else Nbars=Bars;
   if ( counted_bars > 0 )  limit=Nbars-counted_bars;
   if ( counted_bars < 0 )  return(0);
   if ( counted_bars ==0 )  limit=Nbars-Length-1; 
     
	for(shift=limit;shift>=0;shift--) 
   {	
      
	int Step = StepSizeCalc( Length, Kv, StepSize, shift);
 }
при значении переменных:

Length=10
Kv=1
StepSize=0


И код функции.

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

//---- StepSize Calculation

   double StepSizeCalc ( int Len, double Km, int Size, int k)
   {

   double result;
   if( Size==0 ) 
   {
        double AvgRange=0;
	     for (int i=Len-1;i>=0;i--)
	     {   
           
            AvgRange+= (High[k+i]-Low[k+i]);
            	
        }
        
	     ATR0 = AvgRange/Len;
	
	if (ATR0>ATRmax) ATRmax=ATR0;
	if (ATR0<ATRmin) ATRmin=ATR0;

	result=MathRound(0.5*Km*(ATRmax+ATRmin)/Point); 
	}
	else
	result=Km*StepSize;
   
   return(result);
   }

Добавлено: Пн янв 15, 2007 4:30 pm
Terranin
VVV писал(а):Люди добрые, помогите перевести вот этот кусок кода. У меня где-то там ошибка, а где не пойму.

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

int start()
  {
   int shift, counted_bars=IndicatorCounted();
     
   if ( BarsNumber > 0 ) int Nbars=BarsNumber; else Nbars=Bars;
   if ( counted_bars > 0 )  limit=Nbars-counted_bars;
   if ( counted_bars < 0 )  return(0);
   if ( counted_bars ==0 )  limit=Nbars-Length-1; 
     
	for(shift=limit;shift>=0;shift--) 
   {	
      
	int Step = StepSizeCalc( Length, Kv, StepSize, shift);
 }
при значении переменных:

Length=10
Kv=1
StepSize=0


И код функции.

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

//---- StepSize Calculation

   double StepSizeCalc ( int Len, double Km, int Size, int k)
   {

   double result;
   if( Size==0 ) 
   {
        double AvgRange=0;
	     for (int i=Len-1;i>=0;i--)
	     {   
           
            AvgRange+= (High[k+i]-Low[k+i]);
            	
        }
        
	     ATR0 = AvgRange/Len;
	
	if (ATR0>ATRmax) ATRmax=ATR0;
	if (ATR0<ATRmin) ATRmin=ATR0;

	result=MathRound(0.5*Km*(ATRmax+ATRmin)/Point); 
	}
	else
	result=Km*StepSize;
   
   return(result);
   }
В форекс тестере нет необходимости крутить циклы по барам. В функцию индикатора передается номер (index) бара который надо рассчитать. Программа сама пройдется по нужным барам в правильном порядке.

Т.е. все содержимое Start можно выкинуть и оставить только вторую функцию, shift будет равен index.

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

procedure Calculate(index: integer); stdcall;
var
  i: integer;
  AvgRange, ATR0, ATRmax, ATRmin, res: double;
begin
  if index + Length >= Bars then
    exit;

  if StepSize = 0 then
    begin
      AvgRange := 0;
	    for i:=Length - 1 downto 0 do
        AvgRange := AvgRange + High(index + i) - Low(index + i);
      ATR0 := AvgRange/Length;

  	  if (ATR0 > ATRmax) then ATRmax := ATR0;
	    if (ATR0 < ATRmin) then ATRmin := ATR0;

	    res := Round(0.5*Kv*(ATRmax + ATRmin)/Point);
    end
	else
	  res := Kv*StepSize;

  buff[index] := res;
end;