Im trying to code up some trade management - and for some reason I can't get it working.
Firstly there are no entry rules as the object of this code is to add an automated exit to a manual entry. I believe I am having problems with orderhandle as I dont believe the code is identifying when a trade is opened. Please note the manual entry could also include buystop / sell stop - i dont know if this effects anything.
can someone cast their eye over this code and give me some pointers?
Code: Select all
library JBNJBQEXIT;
uses
SysUtils, Classes, StrategyInterfaceUnit, technicalfunctions;
var
// External parameters
Currency: PChar = nil;
TimeFrame: integer;
lookback:integer;
LotSize: double;
STOPLOSS: integer;
BREAKEVEN: integer;
STOCCURRENT: Double;
STOCPREV: Double;
STOC: integer;
STOCUPPER: Integer;
STOCLOWER: Integer;
LOWEST: Integer;
HIGHEST: Integer;
LOWVALUE: double;
HIGHVALUE: double;
// custom variables
OrderHandle: integer;
OrderStyle: TTradePositionType;
OpenTime: TDateTime;
{-----Init strategy-----------------------------------------}
procedure InitStrategy; stdcall;
begin
StrategyShortName('JBNJBQ');
StrategyDescription('Jack be nimble exit');
// Register external parameters
RegOption('Currency', ot_Currency, Currency);
ReplaceStr(Currency, 'EURUSD');
RegOption('Timeframe', ot_Timeframe, TimeFrame);
TimeFrame := 15;
RegOption('Stoploss', ot_Integer, STOPLOSS);
STOPLOSS := 30;
RegOption('BREAKEVEN', ot_Integer, BREAKEVEN);
BREAKEVEN := 15;
RegOption('STOC UPPER BUY LEVEL', ot_Integer, STOCUPPER);
STOCUPPER := 80;
RegOption('STOC LOWER SELL LEVEL', ot_Integer, STOCLOWER);
STOCLOWER := 20;
RegOption('Number of bars back', ot_Integer, LOOKBACK);
LOOKBACK := 10;
end;
{-----Done strategy---------------------------------------}
procedure DoneStrategy; stdcall;
begin
FreeMem(Currency);
end;
{-----Reset strategy--------------------------------------}
procedure ResetStrategy; stdcall;
begin
Orderhandle := -1;
STOC := CreateIndicator (Currency, Timeframe, 'Stochastic', '10;5;10;close/close');
end;
{-----Process single tick----------------------------------}
procedure GetSingleTick; stdcall;
begin
STOCCURRENT := GetIndicatorValue(STOC, 0, 0);
STOCPREV := GetIndicatorValue(STOC, 1, 0);
LOWEST := iLowest(Currency, Timeframe, MODE_CLOSE, lookback, 0);
HIGHEST := iHighest(Currency, Timeframe, MODE_CLOSE, lookback, 0);
LOWVALUE := iLow(Currency, Timeframe, LOWEST);
HIGHVALUE := iHigh(Currency, Timeframe, HIGHEST);
// check our currency
if Symbol <> string(Currency) then exit;
// set currency and timeframe
SetCurrencyAndTimeframe(Symbol, TimeFrame);
// check open orders
if OrderSelect(0, SELECT_BY_POS, MODE_TRADES) then
if (OrderType = tp_Sell) or (OrderType = tp_Buy) then
begin
Orderhandle :=1;
end;
// STOPLOSS BUY
if OrderSelect(0, SELECT_BY_POS, MODE_TRADES) THEN
if (OrderHandle <>-1) and (OrderStyle = tp_Buy) and
(OrderProfitPips <=-STOPLOSS) then
begin
CloseOrder(OrderHandle);
end;
// STOPLOSS SELL
if OrderSelect(0, SELECT_BY_POS, MODE_TRADES) THEN
if (OrderHandle <>-1) and (OrderStyle = tp_Sell) and
(OrderProfitPips <=-STOPLOSS) then
begin
CloseOrder(OrderHandle);
end;
// MOVE BREAKEVEN STOP BUY
if OrderSelect(0, SELECT_BY_POS, MODE_TRADES) THEN
if (OrderHandle <>-1) and (OrderStyle = tp_Buy) and (OrderProfitPips >= BREAKEVEN) then
begin
ModifyOrder(OrderHandle,0,OrderOpenprice,0);
end;
// MOVE BREAKEVEN STOP SELL
if OrderSelect(0, SELECT_BY_POS, MODE_TRADES) THEN
if (OrderHandle <>-1) and (OrderStyle = tp_Sell) and (OrderProfitPips >= BREAKEVEN) then
begin
ModifyOrder(OrderHandle,0,OrderOpenprice,0);
end;
// TRAILING STOP BUY
if OrderSelect(0, SELECT_BY_POS, MODE_TRADES) THEN
if (OrderHandle <>-1) and (OrderStyle = tp_Buy) and (OrderProfitPips >= BREAKEVEN) THEN
if (STOCPREV < STOCUPPER) and (STOCCURRENT > STOCUPPER) THEN
begin
ModifyOrder(OrderHandle,0,LOWVALUE,0);
end;
// TRAILING STOP SELL
if OrderSelect(0, SELECT_BY_POS, MODE_TRADES) THEN
if (OrderHandle =-1) and (OrderStyle = tp_Sell) and (OrderProfitPips >= BREAKEVEN) THEN
if (STOCPREV > STOCLOWER) and (STOCCURRENT < STOCLOWER) THEN
begin
ModifyOrder(OrderHandle,0,HIGHVALUE,0);
end;
// IF ORDER CLOSED THEN RESET
if OrderClosed(OrderHandle) then
begin
Orderhandle := -1;
end;
end;
exports
InitStrategy,
DoneStrategy,
ResetStrategy,
GetSingleTick;
end.
Thanks in advance =)