Страница 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;
это условие кстати можно записать как
Такая строка некорректна
надо писать
Эти вызовы Print не пишут ничего кроме того что в скобках
Если надо вывести значение то нужно его преобразовать в строку, например:
Код: Выделить всё
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;