I am fluent in Easy Language but I cannot get the IBPlugin code to work in a strategy in any way, shape or form. I am requesting for anyone to post a strategy in Easy Language that uses the IBPlugin and performs successfully. I would like to see the exact implementation of how the IBPlugin is arranged within the easy language code - primarily the buy and sell statements.
You may block out proprietary components of your code if you wish. I'm just trying to get an idea of how to make this work.
I have installed the IBPlugin Demo strategy and it works. But I cannot figure out how to use the code when actual Buy and Sell orders are used. Any help would be much appreciated. Thanks, James
Requesting a simple Easy Language/Strategy example using IBPlugin
-
- Posts: 5
- Joined: Fri Oct 22, 2021 3:35 am
-
- Site Admin
- Posts: 244
- Joined: Mon Apr 24, 2017 3:24 pm
Re: Requesting a simple Easy Language/Strategy example using IBPlugin
The sample that is installed along with IBPlugin and be tested on MultiCharts should run
perfectly without any problems also on TS.
This sample is discussed in this video:
https://youtu.be/lH3GE_pDm48?list=PLYD3 ... dcECuxa954
The example demonstrates the most important features.
Please mind: Other than in your code, all code is within the "initialized" condition.
So it is exectued once.
You wondered about the code multiple times executed but you definitely made the mistake to place
it outside the initialized flag. Then of course, it is executed with each call of the script and this is a matter
of EasyLanguage and not of IBPlugin.
Find attached the plugin sample and a small script just placing a MKT order ONCE each time you attach
the script to the chart.
Unfortunately, when i sent you a small code sample, i did the same mistake and leave some code placing orders
outside the condition flag.
So the new small example has corrected this. Please check out.
perfectly without any problems also on TS.
This sample is discussed in this video:
https://youtu.be/lH3GE_pDm48?list=PLYD3 ... dcECuxa954
The example demonstrates the most important features.
Please mind: Other than in your code, all code is within the "initialized" condition.
So it is exectued once.
You wondered about the code multiple times executed but you definitely made the mistake to place
it outside the initialized flag. Then of course, it is executed with each call of the script and this is a matter
of EasyLanguage and not of IBPlugin.
Find attached the plugin sample and a small script just placing a MKT order ONCE each time you attach
the script to the chart.
Unfortunately, when i sent you a small code sample, i did the same mistake and leave some code placing orders
outside the condition flag.
So the new small example has corrected this. Please check out.
- Attachments
-
- ts_signal.zip
- (2.2 KiB) Downloaded 655 times
-
- ibplugin_demo.zip
- (3.42 KiB) Downloaded 659 times
-
- Posts: 5
- Joined: Fri Oct 22, 2021 3:35 am
Re: Requesting a simple Easy Language/Strategy example using IBPlugin
First of all, there is no BUY statement in your small ts_signal strategy. This is what you have:
etc., etc., etc.,
If I attach that strategy/script to a chart it will just buy a market order the second I run it and do nothing else. But why would I want it to do that? I want it to buy when this is true:
Or any IF/THEN statement for that matter.... that is what a strategy is. When I move that line of code below the:
then nothing happens. When I move it above it the strategy will immediately send a market order and then do nothing else.
I will post the entire version of the code I'm experimenting below again. And if you could please tell me why it's not working. I have even simplified it to do only one thing. If the close is below the AVG, then send a sell market order. Right now it does nothing.
Code: Select all
inputs:
Length( 9 );
variables:
Avg( 0 ) ;
Avg = AverageFC( Close, Length ) ;
if Initialized = 0 then begin
once clearprintlog;
etc., etc., etc.,
If I attach that strategy/script to a chart it will just buy a market order the second I run it and do nothing else. But why would I want it to do that? I want it to buy when this is true:
Code: Select all
If close < Avg then begin
Code: Select all
if Initialized = 0 then begin
I will post the entire version of the code I'm experimenting below again. And if you could please tell me why it's not working. I have even simplified it to do only one thing. If the close is below the AVG, then send a sell market order. Right now it does nothing.
Code: Select all
external: "ibplugina.DLL", int, "ibgTS_ON_CREATE", IEasyLanguageObject;
external: "ibplugina.DLL", int, "ibgTS_ON_DESTROY", IEasyLanguageObject;
DefineDLLFunc: "ibplugina.DLL",int, "ibgCONNECT",
int,{connid}
LPSTR,{ip}
int,{port}
int,{clientid}
int,{nbr_channels}
int;{timeout}
DefineDLLFunc: "ibplugina.DLL",int, "ibgNAME_TO_UID",
LPSTR;{symbol}
DefineDLLFunc: "ibplugina.DLL",int64, "ibgORDER_SEND_STR",
int,{connid}
int,{uidc}
int64,{uid}
LPSTR,{order_attrib_list}
int;{id_allocation}
DefineDLLFunc: "ibplugina.DLL",int, "ibgORDER_DELETE",
int,{connid}
int64,{uid}
int;{sync}
DefineDLLFunc: "ibplugina.DLL",int64, "ibgORDER_CLOSE",
int,{connid}
int64,{uid}
int;{sync}
DefineDLLFunc: "ibplugina.DLL",LPSTR, "ibgORDER_ATTRIBUTE",
int,{connid}
int64,{uid}
int;{idattrib}
DefineDLLFunc: "ibplugina.DLL",int, "ibgCREATE_PENDING_ORDER_SNAPSHOT",
int,{connid}
int,{conid}
int;{istrict}
DefineDLLFunc: "ibplugina.DLL",double, "ibgORDER_INFO_DBL",
int,{idx}
int;{tag}
DefineDLLFunc: "ibplugina.DLL",int, "ibgORDER_INFO_INT",
int,{idx}
int;{tag}
DefineDLLFunc: "ibplugina.DLL",int64, "ibgORDER_INFO_INT64",
int,{idx}
int;{tag}
DefineDLLFunc: "ibplugina.DLL",LPSTR, "ibgORDER_INFO_STR",
int,{idx}
int;{tag}
DefineDLLFunc: "ibplugina.DLL",int, "ibgORDER_STATUS",
int64;{uid}
DefineDLLFunc: "ibplugina.DLL",int, "ibgWAIT_SUBMITTED",
int64,{uid}
int;{timeout}
DefineDLLFunc: "ibplugina.DLL",int, "ibgWAIT_FILLED",
int64,{uid}
int;{timeout}
DefineDLLFunc: "ibplugina.DLL",int, "ibgPOSITION_CLOSE",
int,{connid}
int,{uidc}
LPSTR,{account_list}
int;{sync}
DefineDLLFunc: "ibplugina.DLL",double, "ibgACCOUNT_INFO",
int,{connid}
int,{idinfo}
LPSTR;{account_list}
DefineDLLFunc: "ibplugina.DLL",LPSTR, "ibgACCOUNT_INFO_STR",
int,{connid}
int,{idinfo}
LPSTR;{account_list}
DefineDLLFunc: "ibplugina.DLL",int, "ibgCREATE_POSITION_SNAPSHOT",
int;{connid}
DefineDLLFunc: "ibplugina.DLL",double, "ibgPOSITION_INFO_DBL",
int,{idx}
int;{tag}
DefineDLLFunc: "ibplugina.DLL",int, "ibgPOSITION_INFO_INT",
int,{idx}
int;{tag}
DefineDLLFunc: "ibplugina.DLL",int64, "ibgPOSITION_INFO_INT64",
int,{idx}
int;{tag}
DefineDLLFunc: "ibplugina.DLL",LPSTR, "ibgPOSITION_INFO_STR",
int,{idx}
int;{tag}
Variables:
int conid(12087792), {IBKR unique id for EUR.USD}
int port(7496), {API port of TWS or Gateway. Make sure API is on. Active X enabled, port same as here..}
int connection_id(1), {ID of connection}
string order_attribute_str(""), {list of attrib=value pairs as order attributes}
string strategy_name("my_strat1"), {Name of this strategy}
int total_objects(0), {Total number of non ZERO positions or pending orders at snapshot time}
double uid_order(0), {unique id of order. We need double here as it has 8 bytes. MC/TC has no 64 bit integer which is the native type of uid}
int uid_parent_order(0), {unique id of parent order}
string fingerprint(""), {fingerprint of position or order}
int order_status(0), {status of order in focus: PendingSubmit=5, PreSubmitted=7,Submitted=8,Filled=9,Cancelled=10,FilledPartially=11}
string order_type(""), {type of order in focus: MKT,LMT,STP}
double lmt_price(0.0), { limit price for an order we like to place}
int ret_int(0), {buffer for int return values}
double ret_double(0.0), {buffer for double returnvalues}
string ret_str(""), {buffer for string return values}
int idx(0), {Loop index}
int Initialized(0); {init flag flag}
inputs:
Length( 9 );
variables:
Avg( 0 ) ;
Avg = AverageFC( Close, Length ) ;
if Initialized = 0 then begin
If close < Avg then begin
once clearprintlog;
// Strategy name is taken as comment tag in order reference (to have a hint where this order comes from)
Print("ES IBPlugin");
// if you mapped the symbol of this chart to an IBKR contract using the IBPlugin admin tool, you could call
// the mapping function in order to obtain IBKR contract id.
conid=ibgNAME_TO_UID("EURUSD");
Print("conid=",conid);
// --------------------------------------------
// connect to TWS / Gateway at standard port. make sure TWS or Gateway are setup to operate with API clients such as ibplugin.
// Video API client setup: http://www.youtube.com/watch?v=53tmypRq5wI
// The client id is set to auto.It is created by hash value of configuration.
// The conifguration name for TS and MC is always: TSTN_MUCT
// NOTE: call this function only ONCE. The IBPlugin will keep connection to TWS, even, when TWS restarts.
ret_int=ibgCONNECT(connection_id,"",port,-1,1,20000);
// conn state = 1: connected to TWS; =2: plugin connected to TWS and TWS connected to IBServer;3=all initial requests done
Print("connection status=", ret_int);
// place MKT SELL Order
Print("--- place MKT order");
order_attribute_str="#1=150000#53=SELL#6=MKT#49=";
// wwrite strategy name into comment of order
order_attribute_str += strategy_name;
uid_order=ibgORDER_SEND_STR(connection_id,conid,0, order_attribute_str,0);
Print("uid MKT=", uid_order);
if uid_order > 0 then
begin
// wait order for been filled
// out: 1=order filled
// 0=timeout
// -1=Order can't be filled (e.g. invalid for what reason ever)
ret_int=ibgWAIT_FILLED(uid_order,5000);
end;
end;
Initialized=1;
end;
#Events
// create a configuration of name TSTN_MUCT
// The configuration files - so also the symbol mapping database: contract.db
// can be found in folder:
// c:\trade-commander.com\ibplugin\configurations\TSTN_MUCT
OnCreate = ibgTS_ON_CREATE;
OnDestroy = ibgTS_ON_DESTROY;
#end
-
- Site Admin
- Posts: 244
- Joined: Mon Apr 24, 2017 3:24 pm
Re: Requesting a simple Easy Language/Strategy example using IBPlugin
:First of all, there is no BUY statement...
There is, please look a bit closer: order_attribute_str="#1=1#53=BUY#6=MKT#49=";
The order is defined by an attribute string. The possible attributes are listed in the help.
Yes. This is what it should do. The intialized flag is intended to execute the BUY MKT order just once. When this code is called, initialized is set to 1 and so the code withinIf I attach that strategy/script to a chart it will just buy a market order
condition is not executed again.
I remember that you first copied the code, changed it and placed your orders outside the "initialized" condition and you wondered why
it placed so many orders. Well, this condition in the sample is intended to avoid exactly such situations.
When the script is called first time, it executes the code below Initialized. If the average condition is given, you are lucky, if not,if Initialized = 0 then begin
If close < Avg then begin
nothing will happen, because this code section never called again, because initialized is now 1.
When you move this code outside the initialize section, the code is executed each time close < Avg. And i guess, this can be the case very often.
And so no wonder all code below this condition is executed multiple times.
But i don't want to discuss EL code logic here. Please have understanding for this. It is focused on IBPlugin functions.
Again: The sample script places all IBPlugin functions within the initialized condition to execute them only once for demonstrating purpose.
And this is exactly what happens.
I suggest: Outcomment all IBPlugin function calls. Make console Printouts instead. Run the script. Once you think the console printouts occur like
intended, enable IBPlugin function calls and all should be fine.
IBPlugin code that just need to be called once, keep it inside initialization flag. This applies at least for connect the symbol mapping function.