Welcome to the Traders Laboratory Forums.
TradeStation Custom Programming Discuss projects, ideas, obstacles in programming with TradeStation.

Reply
Old 10-25-2011, 01:56 PM   #1

Tradewinds's Avatar

Join Date: Nov 2008
Location: Northeast U.S.
Posts: 891
Ignore this user

Thanks: 373
Thanked 231 Times in 164 Posts
Blog Entries: 6

PlaceOrder - Execute an Order from an Indicator

.PlaceOrder <p...> Allows orders to be placed from macros or EasyLanguage using the provided parameters.

The Place Order command allows orders to be sent to the market inside of an indicator. There is no backtesting capability for this function though. It allows orders to be placed intrabar, as opposed to "Next Bar" which a strategy does. One issue is that orders could be placed on EVERY TICK of the bar if the conditions are met. So you MUST be very careful, and make sure that your code has some way of limiting true conditions to once per bar, or as needed.

Quote:
.PlaceOrder <p...> Allows orders to be placed from macros or EasyLanguage using the provided parameters.

tradestation Help


.PlaceOrder Command

Places an order using a macro command or with RunCommandOnLastBar from EasyLanguage.

Syntax:

.PlaceOrder "< parameter='keyword' >, < parameter=number >... ,< parameter='string' > "

Parameter Options

A value shown below in italics represents a user specified character string, number, or macro name. All non-italic character values are keywords (i.e. Buy, False, Day+, etc). In addition, it is required that character strings, macro names, and keyword values be enclosed in single quotes.

Advanced Parameters

The .PlaceOrder parameters have been expanded as of tradestation 8.5. See .PlaceOrder Advanced Parameters for more details.

Parameter

Value (Italicized string values are used with 'single quotes')


account> String
action> Buy, Sell, SellShort, BuyToCover, BuyToOpen, SellToOpen, SellToClose, BuyToClose
ActivationPrices> String
AllOrNone> True, False
BuyMinusSellPlus> True, False
Discretionary> Number, 0 {represents False}
Duration> Day, Day+, GTC, GTC+, GTD, GTD+, IOC, FOK, OPG, CLO, 1 Min, 3 Min, 5 Min
ECNSweep> True, False
GTDDate> String ('MM/DD/YY' date format)
IfTouched> Number, 0 {represents False}
LimitPrice> Number
MustBeUnique> True, False
NonDisplay> True, False
OCOBracketName> String
OCOGroupName> String
OrderEntryMacro> Order Entry Macro Name
OrderName> String {limited to 20 characters}
OrderType> Market, Limit, Stop Market, Stop Limit
OSOTriggerBy> String {Reference the OrderName of an existing open order}
Peg> True, False
Quantity> Number
QuantityType> Shares, Currency
Route> Intelligent, AMEX, ARCX, AUTO, BATS, BTRD, CDRG, SuperDOT, EDGA, EDGX, GFLO, NITE, NQBX, NSDQ, NYSE

See Order Routes for Equities or Order Routes for Options for details.

ShowOnly> Number, 0 {represents False}
Stage> True, False
StartTime> String {hh:mm:ss AM/PM}
StopPrice> Number
Symbol> String
SymbolCategory> Equity, Future, Forex, EquityOption, IndexOption
TrailingAmount> Number, 0 {represents False}
TrailingType> pts, pct, minmove

Example:

Calling from a Command Line Macro:

.PlaceOrder "Action='Buy', Symbol='MSFT', SymbolCategory='Equity', OrderType='Limit', LimitPrice=25.00, Quantity=500, Duration='Day', Account='12345' "

Calling from EasyLanguage:

An example of using the .PlaceOrder command may be found in the EasyLanguage PlaceOrder (Function) found in the tradestation EasyLanguage Reserved Words & Functions. Order specific functions using the PlaceOrder function are also in the EasyLanguage dictionary and make the use of the .PlaceOrder command call.

For example, the following order specific function call executes the same order as the .PlaceOrder command line macro above. Extra parameters in the function place the order just once for a Day duration.

Value1 = LimitOrder("Once","12345" ,"Buy","Equity","MSFT",10 0,"Day","",25.00);


It is required that character strings, macro names, and keyword values be enclosed in single quotes.
__________________
Precise, "dialed-in", targeted combination setups, like opening a combination lock; is the experience you should be having while trading. Dial left, right, left, . . . click - the lock opens.
Tradewinds is offline  
Reply With Quote
The Following User Says Thank You to Tradewinds For This Useful Post:
trade-samarai (10-28-2011)
Old 10-25-2011, 02:26 PM   #2

Tradewinds's Avatar

Join Date: Nov 2008
Location: Northeast U.S.
Posts: 891
Ignore this user

Thanks: 373
Thanked 231 Times in 164 Posts
Blog Entries: 6

Re: PlaceOrder - Execute an Order from an Indicator

EasyLanguage has some built in functions that use the PlaceOrder command:

LimitIfTouchedOrder
MarketIfTouchedOrder
MarketOrder
StopLimitOrder
StopMarketOrder
TrailingStopOrder

LimitOrder(Frequency,Acco unt,Action,SymbolCategory ,Symbol,Quantity,Duration ,GTDDate,LimitPrice)
MarketIfTouchedOrder(Freq uency,Account,Action,Symb olCategory,Symbol,Quantit y,Duration,GTDDate,IfTouc hed)

'IfTouched' = Sets the IfTouched price to be used for this order.
__________________
Precise, "dialed-in", targeted combination setups, like opening a combination lock; is the experience you should be having while trading. Dial left, right, left, . . . click - the lock opens.
Tradewinds is offline  
Reply With Quote
Old 10-26-2011, 05:55 PM   #3

Tradewinds's Avatar

Join Date: Nov 2008
Location: Northeast U.S.
Posts: 891
Ignore this user

Thanks: 373
Thanked 231 Times in 164 Posts
Blog Entries: 6

Re: PlaceOrder - Execute an Order from an Indicator

Here is the code that I have so far. I have a way of trying to keep the order from firing more than once per bar. As soon as the condition to send the order is met, I set a variable to 'True'.

xLngFired = True;

The Exit Long Order fired.


This variable tells me that the conditions were met, and the order was sent. But I still seem to be getting multiple orders being sent per bar. I'm not sure what is wrong. The following code is not the entire code, it is a representation of the basic structure that I have. In my code I have multiple data sources, six data sources in the same indicator. I don't know if the multiple data sources are causing a problem. I'm just making wild guesses at this point. When I study the code below, it seems like it should prohibit the order from being sent more than once per bar, but it doesn't seem to be working.

Code:
Input: AccntNum("SIM99999F"), 
	Ticker("ESZ11"); 
var: QtyOpen(0), 
	xLng(False), 
	xLng1(False), 
	xLng2(False), 
	xShrt(False), 
	xShrt1(False), 
	xShrt2(False), 
	Peak(False), 
	Bttm(False), 
	CrrntHi(0), 
	CrrntLw(0), 
	HigherHigh(False), 
	LowerLow(False), 
	HigherHighData2(False), 
	LowerLowData2(False), 
	IntrabarPersist xLngFired(True), 
	IntrabarPersist xShrtFired(True); 
 
Peak = H[1] > H[2]; 
Bttm = L[1] < L[2]; 
 
If Peak then CrrntHi = H[1]; 
If Bttm then CrrntLw = L[1]; 
 
HigherHigh = H > CrrntHi; 
LowerLow = L < CrrntLw; 
 
xLng1 = HigherHigh; 
xShrt1 = LowerLow; 
 
xLng2= HigherHighData2 and HigherHighData2[1] = False; 
xShrt2 = LowerLowData2 and LowerLowData2[1] = False; 
 
xLng = xLng1 or xLng2; 
xShrt = xShrt1 or xShrt2; 
 
If xLng or xShrt then QtyOpen = GetPositionQuantity(Ticker, AccntNum); 
 
If xLng and QtyOpen > 0 and xLngFired = False then begin 
	xLngFired = True; // Immediately indicate that the conditions have been met. 
	value1 = MarketOrder("OncePerBar", AccntNum, "Sell", "Future", Ticker, QtyOpen); 
	Condition1 = (PlaySound("c:\Wave\Sell.wav")); 
End; 
 
If xShrt and QtyOpen < 0 and xShrtFired = False then begin 
	xShrtFired = True; 
	value2 = MarketOrder("OncePerBar", AccntNum, "Buy", "Future", Ticker, absValue(QtyOpen)); 
	Condition2 = (PlaySound("c:\Wave\Buy.wav")); 
End; 
 
If Barstatus(1) = 2 then begin // At the end of the bar, reset the variables to False 
	if xLngFired = True then xLngFired = False; 
	if xShrtFired = True then xShrtFired = False; 
End;
__________________
Precise, "dialed-in", targeted combination setups, like opening a combination lock; is the experience you should be having while trading. Dial left, right, left, . . . click - the lock opens.
Tradewinds is offline  
Reply With Quote
The Following User Says Thank You to Tradewinds For This Useful Post:
trade-samarai (10-28-2011)
Old 10-27-2011, 11:26 PM   #4

Tradewinds's Avatar

Join Date: Nov 2008
Location: Northeast U.S.
Posts: 891
Ignore this user

Thanks: 373
Thanked 231 Times in 164 Posts
Blog Entries: 6

Re: PlaceOrder - Execute an Order from an Indicator

I've got a couple of threads started at the tradestation EasyLanguage site about the issue of conditions getting met multiple times per bar. I'm having this problem with multiple indicators that I use. So, for now, placing a real order through an indicator isn't viable. Even if I designate the frequency parameter setting to 'OncePerBar', I'm still getting multiple orders firing all at once.
__________________
Precise, "dialed-in", targeted combination setups, like opening a combination lock; is the experience you should be having while trading. Dial left, right, left, . . . click - the lock opens.
Tradewinds is offline  
Reply With Quote
Old 10-28-2011, 09:50 AM   #5

Join Date: May 2010
Posts: 181
Ignore this user

Thanks: 0
Thanked 49 Times in 38 Posts

Re: PlaceOrder - Execute an Order from an Indicator

Replace complex (proprietary) code with the smallest code that achieves each state of a simple model. All those vars and conditions defining a complex trigger can be replaced with a simple trigger. By reducing complex ideas to the least number of vars you should never have trouble debugging code.

var: intrabarpersist done(false);

if H>H[1] then done=true;
if barstatus(1)=2 then done=false;
onesmith is offline  
Reply With Quote
Old 10-28-2011, 11:49 AM   #6

Join Date: May 2010
Posts: 181
Ignore this user

Thanks: 0
Thanked 49 Times in 38 Posts

Re: PlaceOrder - Execute an Order from an Indicator

var: intrabarpersist done(false);

if c>H[1] then done=true; // edited to enable multiple_intrabar_states
if barstatus(1)=2 then done=false;

Last edited by onesmith; 10-28-2011 at 12:49 PM.
onesmith is offline  
Reply With Quote
Old 10-28-2011, 12:33 PM   #7

Join Date: Nov 2008
Location: a city in Texas
Posts: 40
Ignore this user

Thanks: 41
Thanked 10 Times in 10 Posts

Re: PlaceOrder - Execute an Order from an Indicator

Thanks guys for getting me thinking about PlaceOrder macros. They are very helpful for fast discretionary trading such as earnings announcements, etc. I have several speed keys I use on TS, however, they could always use some improvement. I didn't really thoroughly inspect the codes posted, but you two reminded me that it's something to work on. The hardest part for me is getting started.

P.S. the new OOEL also has an OrderTicket in the ToolBox that you can use instead of macros.

Last edited by trade-samarai; 10-28-2011 at 12:40 PM.
trade-samarai is offline  
Reply With Quote
Old 10-28-2011, 12:48 PM   #8

Tradewinds's Avatar

Join Date: Nov 2008
Location: Northeast U.S.
Posts: 891
Ignore this user

Thanks: 373
Thanked 231 Times in 164 Posts
Blog Entries: 6

Re: PlaceOrder - Execute an Order from an Indicator

Quote:
Originally Posted by trade-samarai »
P.S. the new OOEL also has an OrderTicket in the ToolBox that you can use instead of macros.
Oh! Really! I'll have to check that out!

tsdata.Trading.OrderTicke t

Quote:
The OrderTicket component generates and sends an order ticket for a specified symbol from your EasyLanguage code. OrderTicket objects support a number of the order parameters (see below) that are available when manually placing an order from the tradestation Order Bar. The status of all OrderTicket orders appear on the Orders tab of the TradeManager along with other regular orders. tradestation HELP
This is the Object Oriented tradestation code example.

Code:
{
This example uses an OrderTicket component to send a Buy at Market order for
the current stock symbol based on a specified account and quantity.  All of 
the order properities must consistent with the asset class of the symbol.

NOTE: After inserting an indicator containing an order object to an analysis
window, you'll need to go to the Format-General tab and check 'Enable order 
placements objects' to allow orders to be sent from the indicator.

You'll need to enter your own equities account number and change the quanitity
as appropriate.  To place the order, change the PlaceOrderNow input to TRUE.  
Once set to TRUE, orders will also be sent when a RadarScreen refresh occurs.

 The following items were created or modified:
   Component tray: OrderTicket1 dragged into document from the Toolbox
   Properties editor: Symbol assigned to current Symbol (current row in RS).
   Properties editor: Account and Quantity get their values from inputs
 These additional properties specify related order assumptions:
   Properties editor: SymbolType set to Stock (must compatible with the asset type of the account)
   Properties editor: Action set to Buy 
   Properties editor: Type set to Market 
   Properties editor: Duration set to Day
}

Input: string iAccount1( "Enter Your Equities Account Number" ), int iQuantity1(100), PlaceOrderNow(FALSE);

{The MyOrder variable will refer to the Order instance after the order is sent}
vars: tsdata.trading.Order MyOrder(NULL);

{Called whenever the order status is updated}
Method void OrderStatusUpdate(elsystem.Object sender, tsdata.trading.OrderUpdatedEventArgs args)
begin
	UpdatePlots();
end;

{Plots the order status}
method void UpdatePlots()
begin
	Plot1(MyOrder.State.ToString()); 
end;

{Send the order when TRUE and sets the method used to handle Order Status Updated events} 
If PlaceOrderNow then begin
	{Order sent only once per load in this example}
	once MyOrder = OrderTicket1.Send();
	MyOrder.Updated += OrderStatusUpdate;
	UpdatePlots();
end;
__________________
Precise, "dialed-in", targeted combination setups, like opening a combination lock; is the experience you should be having while trading. Dial left, right, left, . . . click - the lock opens.
Tradewinds is offline  
Reply With Quote

Reply

Thread Tools
Display Modes Help Others By Rating This Thread
Help Others By Rating This Thread:


Similar Threads
Thread Thread Starter Forum Replies Last Post
When Your Stop Loss Doesn't Execute JLJ Beginners Forum 39 03-12-2012 10:38 AM
Execute Orders on Data2 Subchart skan Coding Forum 7 12-07-2010 06:39 AM
Divergences in Order Flow As a Very Reliable Longer Term Indicator UrmaBlume Technical Analysis 0 10-02-2009 12:39 PM
Stop Order or Logical Order ? abam Trading and the Markets 4 04-06-2009 04:19 AM
Order spoofing notouch Market Analysis 12 03-20-2007 08:07 AM

All times are GMT -4. The time now is 10:00 PM.
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
CS to VB integration by DeskLancer
©2006-2011 Traders Laboratory, All Rights Reserved.