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

Образцы, куски исходников, вопросы. Обсуждаем программирование.
Сообщение
Автор
Аватара пользователя
HIDDEN ™
Сообщения: 11
Зарегистрирован: Пт дек 01, 2006 9:22 pm

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

#1 Сообщение HIDDEN ™ » Пт дек 01, 2006 9:29 pm

Во многих своих стратегиях при написании экспертов я использую вот такой расчет рабочего лота. Это наиболее точный расчет лота, есть много вариантов, мне нравится именно этот.

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

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

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

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

#2 Сообщение Terranin » Пт дек 01, 2006 11:25 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
В АПИ есть функции:
OrdersTotal
Symbol
AccountBalance
AccountMargin
AccountLeverage

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

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

Аватара пользователя
HIDDEN ™
Сообщения: 11
Зарегистрирован: Пт дек 01, 2006 9:22 pm

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

#3 Сообщение HIDDEN ™ » Сб дек 02, 2006 7:29 am

Странно но у меня в 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;
Кстате и в предыдущих билдах тоже не компилилилась стратегия.
Может у меня что-то еще не доустановленно? Но помоему проблема не в этом.

Аватара пользователя
HIDDEN ™
Сообщения: 11
Зарегистрирован: Пт дек 01, 2006 9:22 pm

#4 Сообщение HIDDEN ™ » Сб дек 02, 2006 8:42 am

Спрошу ради интереса. А саму стратегию написанную в DLL в последствии можно будет применить в MQL4, как внешнюю функцию, ну и соответственно будит ли она торговать в MetaTreder 4

Аватара пользователя
HIDDEN ™
Сообщения: 11
Зарегистрирован: Пт дек 01, 2006 9:22 pm

#5 Сообщение HIDDEN ™ » Сб дек 02, 2006 11:48 am

Итак читая справку делая все по порядку, решил написать стратегию по индикатору 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.
Вложения
test.zip
(47.3 КБ) 9941 скачивание

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

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

#6 Сообщение Terranin » Сб дек 02, 2006 5:29 pm

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

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

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

#7 Сообщение Terranin » Сб дек 02, 2006 5:31 pm

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

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

#8 Сообщение Terranin » Сб дек 02, 2006 5:34 pm

HIDDEN ™ писал(а):Итак читая справку делая все по порядку, решил написать стратегию по индикатору WPR.

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

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

Аватара пользователя
HIDDEN ™
Сообщения: 11
Зарегистрирован: Пт дек 01, 2006 9:22 pm

#9 Сообщение HIDDEN ™ » Сб дек 02, 2006 7:09 pm

Terranin писал(а):
HIDDEN ™ писал(а):Итак читая справку делая все по порядку, решил написать стратегию по индикатору WPR.

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

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

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

#10 Сообщение Terranin » Вс дек 03, 2006 5:36 am

HIDDEN ™ писал(а):
Terranin писал(а):
HIDDEN ™ писал(а):Итак читая справку делая все по порядку, решил написать стратегию по индикатору WPR.

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

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

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

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

Аватара пользователя
HIDDEN ™
Сообщения: 11
Зарегистрирован: Пт дек 01, 2006 9:22 pm

#11 Сообщение HIDDEN ™ » Пт дек 08, 2006 7:04 pm

Terranin писал(а):Тогда пиши в лог с помощью Print(), например проверь сначала проходит ли тест валюты, вообще там достаточно
if Symbol <> Currency then exit;

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

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

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

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

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

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

#12 Сообщение Terranin » Пт дек 08, 2006 7:10 pm

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

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

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

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

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

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

Аватара пользователя
HIDDEN ™
Сообщения: 11
Зарегистрирован: Пт дек 01, 2006 9:22 pm

#13 Сообщение HIDDEN ™ » Пт дек 08, 2006 7:26 pm

отправил в личку

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

#14 Сообщение Terranin » Пт дек 08, 2006 8:43 pm

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 - вывести строку
Последний раз редактировалось Terranin Пт дек 08, 2006 8:51 pm, всего редактировалось 1 раз.
Asta la vista
Mike

Аватара пользователя
HIDDEN ™
Сообщения: 11
Зарегистрирован: Пт дек 01, 2006 9:22 pm

#15 Сообщение HIDDEN ™ » Пт дек 08, 2006 8:49 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 ...
Интересно, обезательно детально все изучу, кстате справку читал, примеры смотрел, примеры я так понимаю нужно обновить, там много чего видемо некоректного.

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

Аватара пользователя
HIDDEN ™
Сообщения: 11
Зарегистрирован: Пт дек 01, 2006 9:22 pm

#16 Сообщение HIDDEN ™ » Пт дек 08, 2006 8:49 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 ...
Интересно, обезательно детально все изучу, кстате справку читал, примеры смотрел, примеры я так понимаю нужно обновить, там много чего видемо некоректного.

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

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

#17 Сообщение Terranin » Пт дек 08, 2006 8:54 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 ...
Интересно, обезательно детально все изучу, кстате справку читал, примеры смотрел, примеры я так понимаю нужно обновить, там много чего видемо некоректного.

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

Аватара пользователя
HIDDEN ™
Сообщения: 11
Зарегистрирован: Пт дек 01, 2006 9:22 pm

#18 Сообщение HIDDEN ™ » Пт дек 08, 2006 8:57 pm

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 можно будет копировать и даже замахнуться на автоматический транслятор... Плохо что я С++ знаю фигово и никогда не пользовался.
У меня есть человечек один на С++ пишет. Я постараюсь Вас свести вместе.

wellx
Сообщения: 80
Зарегистрирован: Пн окт 23, 2006 9:30 am

#19 Сообщение wellx » Ср дек 13, 2006 2:23 pm

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

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

#20 Сообщение Terranin » Чт дек 14, 2006 5:30 pm

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

wellx
Сообщения: 80
Зарегистрирован: Пн окт 23, 2006 9:30 am

#21 Сообщение wellx » Пт дек 15, 2006 9:59 am

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

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

wellx
Сообщения: 80
Зарегистрирован: Пн окт 23, 2006 9:30 am

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

#22 Сообщение wellx » Пн дек 18, 2006 2:44 pm

Можно ли попросить сделать базовую реализацию аналогов МТ функций iLowest, iHighest, iBarshift.

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

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

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

#23 Сообщение Terranin » Пн дек 18, 2006 10:37 pm

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

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

VVV
Сообщения: 13
Зарегистрирован: Сб дек 09, 2006 12:50 pm

#24 Сообщение VVV » Пн янв 15, 2007 7:40 am

Люди добрые, помогите перевести вот этот кусок кода. У меня где-то там ошибка, а где не пойму.

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

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);
   }

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

#25 Сообщение Terranin » Пн янв 15, 2007 4:30 pm

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;
Asta la vista
Mike

Ответить