Introduction to Trading Systems – Ideas

This is where you can share trading systems that are marginally profitable, i.e., those that should not be traded as they are but that show potential. Typically this would be a basic system that is profitable but experiences draw downs of 50%. Such systems can often be improved by adding Stops, Targets, Money Management, Portfolio techniques, etc. The reality is that while you may not have the expertise to make it work someone else may.

Almost all of us find trading system ideas in books and magazines that we then code in AFL for evaluation. Some of these systems may have been around for many years while others are new ideas. After coding them, almost always, we are disappointed and chuck out the system (work!). Instead of throwing out your work you are invited to post the system here to give another developer a chance to fix it.

You are invited to contribute as an author (requires registration) or in a comment to this post.

Internet Resources for AT

To run Trade-Automation code, you should have the latest software versions of the AmiBroker-Pro and IB-Controller beta and have the AmiBroker Interactive Brokers Data Plugin selected for data source.

To use the AmiBroker Interactive Brokers Controller, you need an Interactive Brokers account. To place simulated orders you can use the TWS-Demo (Login: eDemo, Password: demouser), or, better, you can open a paper-trading account (free). The IB paper trading account is indispensable for any serious testing of your AT systems. The eDemo is very slow and much less adequate than using the TWS paper trading account.

DebugView is an essential tool to trace program execution and create logging files. You may consider creating a custom item in your AmiBroker Tools menu.

To deal with irritating TWS pop-ups common with earlier TWS versions, you may consider a product like PTFB Pro V3.1.0.0 by Technology Lighthouse (just one of many such products – this is not a special endorsement). Lately pop-ups seem to interfere much less, so you may not need this product if you use the most up-to-date version of TWS.

You should consider joining the Amibroker-at forum for discussions about AmiBroker-based Auto-Trading applications. To read about auto-trading in general, you should visit the Elite-Trader and AmiBroker-AT forums. You should visit the Interactive Broker forums to read about the TWS API and other AT topics. Be sure to create an icon for the AmiBroker ReadMeAT.html on your desktop, this file is located in your AmiBroker folder (default location). You might also want to have a copy of the API List of Error messages on your desktop; you will be referring to them frequently.

Edited by Al Venosa

DebugView vs. Interpretation Window

As pointed out in a comment to this series, the Interpretation Window can be a valid alternative to using DebugView. A few points to consider when choosing either method are listed below.

DebugView

Debug information is routed to DebugView using this type of statement:

<p>DBVOn ParamToggle("DebugView","OFF|ON",0); // Controls all output  <p>if( DBVOn ) _TRACE("# BuyPrice ="+NumToStr(BuyPrice,1.2));  

Any type of information that can be expressed in string format can be send to DebugView. A few DebugView features are:

– A stand-alone program
– Display accumulates multi-pass information
– Output includes timing information
– Output can be manually or auto saved to a file
– Optional scrolling display
– Copy and paste to/from clipboard
– History depth setting (#lines displayed)
– Filter/Highlight wrt keywords
– Always on top
– Find
– Software Clear display
– Low overhead (depending on the number of _TRACE() statements used)

Interpretation Window

Debug information is routed to the Interpretation Window using this type of statement:

<p>BuyPrice LastValue(C);  <p>if(Status("Action") == actionCommentary)  
<p>{  
<p>// This code executes only when the Interpretation Window is open.  
<p>printf("Buy=%1.2f\n"BuyPrice);  
<p>}  

Some features offered by the Interpretation Window:

– The Interpretation Window is optimized for Chart-Commentaries
– Only displays info for current pass
– No history
– Copy and paste to clipboard
– An open Interpretation Window adds one full execution cycle to the code.

While not all pros and cons were covered it can be seen from the above listing that DebugView is designed for debugging while the Interpretation Window is not.

When running complex real-time trading systems the additional pass through the AFL code may prove to be too costly in terms of execution speed.

Further comments invited.

Preventing Repeat Orders and Whipsaws

When you are developing a Real-Time trading system, often the first problem you have to solve is to prevent repeat orders. Repeat orders can occur when a signal remains true over several bars or chart refreshes, and each new bar/refresh sends out a new order. This can result in unintentional pyramiding.

Another ordering problem can occur when your entry and exit prices are too close together with respect to price volatility. In this case, the price volatility can whipsaw you in and out of positions in rapid succession. When this happens, slippage and commissions will quickly erode any profits you may have had. Also, if your system cannot keep up with each signal, you may end up in an opposing trade.

A common mistake when attempting to prevent repeat orders is to wait for order confirmation from the TWS after each partial fill. The problem here is that confirmations from the TWS are always subject to significant delay, and they will often let several repeat orders slip through before the acknowledgment is received.

Another flawed method is to filter or smooth the price arrays. Although this may prevent repeat orders, the lag introduced by this technique will kill most systems.

There is no single best way to prevent repeat orders. Your solution will depend on your personal preferences and the principle of your trading system. Under certain conditions you may want to combine several of the methods shown below. The examples presented here are intended to make you aware of the problems involved and suggest some possible solutions. It is your responsibility to modify the code to suit your particular system’s requirements.

To test the demo codes below, you will need to have the TWS running and connected to the IB eDemo or your paper trading account. To keep the programs below as simple as possible, you have to reset the programs after changing the Transmit ParamToggle from Off to On.

Using OrderIDs to prevent repeat orders

When your program calls the PlaceOrder() or ModifyOrder() function, the IBc returns a unique OrderID. The OrderID uniquely identifies the order you placed so that you can refer to it later to modify, cancel, or check order status. The OrderID only acknowledges that the order was placed; it does not mean that the order was transmitted to the market or was filled.

If an OrderID has been received, this means that the order was placed. You can prevent order repeats by checking whether the OrderID has a value. Then, if you only place orders when the OrderID is empty, you cannot place repeat orders. The first example below lets you explore this procedure.

After an order has been filled or cancelled, you may eventually want to transmit a new order. In this case, you will have to define a rule for clearing the OrderID. This rule can be based on order status, a contrary signal, a time delay, the start of a new bar, or any number of things. Note that after you have cleared an OrderID, you can no longer modify or cancel the order it referred to. Hence, you should only clear an OrderID if you are sure that the OrderID is no longer needed, i.e., the order was confirmed cancelled, filled, or rejected.

The method below demonstrates how to use the OrderID, and because it still allows you to enter and exit (whipsaw) a position within milliseconds, it is only a first step to preventing repeats and whipsaws. To run this demo, Insert the code into a chart pane. When you open the Param window you will see these options:

The Chart Title shows IBc connection, OrderID, and Position status. Note that while Interactive Brokers calls all the messages ‘error’ messages, many are just harmless notifications. For more details on these error messages see API Error Messages.

When you click the Buy button, the Title will display the OrderID for the order placed, Order Status, and the position size if the order was filled. If you watch closely when you place an order, you may see order status change, for example from PreSubmitted to Filled:

In this demo you clear the OrderIDs manually. In a real system it would be cleared when your system is ready to allow the next order to go out.

RequestTimedRefresh); 
ibc GetTradingInterface("IB"); 
Transmit ParamToggle("Transmit","OFF|ON",0); 
BuyOrderTrigger ParamTrigger("Place Buy order","BUY"); 
SellOrderTrigger ParamTrigger("Place Sell order","SELL"); 
Reset ParamTrigger("Reset Program","RESET PROGRAM"); 
ClearBuyOrderID ParamTrigger("Clear Buy","CLEAR"); 
ClearSellOrderID ParamTrigger("Clear Sell","CLEAR"); 
BuyOrderID StaticVarGetText("BuyOrderID"); 
SellOrderID StaticVarGetText("SellOrderID"); 


BuyPending ibc.IsOrderPending(BuyOrderID); 
SellPending ibc.IsOrderPending(SellOrderID); 
if( BuyOrderTrigger AND BuyOrderID == "" ) 
{ 
BuyOrderIDibc.PlaceOrderName(), "Buy"100"MKT"00"Day"Transmit); 
StaticVarSetText("BuyOrderID",BuyOrderID); 
SetChartBkColorcolorBrightGreen ); 
} 
if( SellOrderTrigger AND SellORderID == "") 
{ 
SellORderID ibc.PlaceOrderName(), "Sell"100"MKT"00"Day"Transmit); 
StaticVarSetText("SellOrderID",SellOrderID); 
SetChartBkColorcolorRed ); 
} 
else if( Reset ) 
{ 
StaticVarSetText("BuyOrderID",""); 
if( BuyPending ibc.CancelOrderBuyOrderID ); 
StaticVarSetText("SellOrderID",""); 
if( SellPending ibc.CancelOrderSellOrderID ); 
ibc.CloseAllOpenPositions(); 
} 
else if( ClearBuyOrderID AND BuyOrderID != "" )  
{ 
StaticVarSetText("BuyOrderID",""); 
if( BuyPending ibc.CancelOrderBuyOrderID ); 
} 
else if( ClearSellOrderID AND SellOrderID != "" )  
{ 
StaticVarSetText("SellOrderID",""); 
if( SellPending ibc.CancelOrderSellOrderID ); 
} 
LastTWSMsg ibc.getLastError); 
Title "\n""Last TWS Error Msg: "+LastTWSMsg+"\n"" BuyOrder Status: "+WriteIfBuyOrderID != ""BuyOrderID+" "+ibc.GetStatusBuyORderIDTrue ),"")+"\n"" SellOrder Status: "+WriteIfSellOrderID != ""SellOrderID+" "+ibc.GetStatusSellORderIDTrue ),"")+"\n"" TWS Position Size: "+NumToStr(ibc.GetPositionSizeName() ),1.0,False); 

Clearing OrderIDs at the Start of a New Bar

In this example the OrderIDs are automatically cleared at the start of a new bar. This limits each type of trade (Buy, Sell, short, or Cover) to one per bar. If you want to place a new order while an order is pending, you may either cancel it first or modify the pending order.
Since the start of a new bar can only be detected when its first quote arrives, it is impossible to get a fill at this time. The earliest time an order can be filled is on the second quote of the bar. How long this takes depends on market volume and whether you use eSignal (trades) or IB data (snapshots). Since the Opening quote can occur at any time during the bar interval, it may take from zero to the full bar interval before the OrderIDs are cleared. To prevent this delay, you can clear the orders with reference to your system’s clock. However, this requires that your system is perfectly synchronized with the market-time (see next example).
The best way to test this example is to use a 1-minute database and set your chart to the 5-minute timeframe. Next, open the Bar-Replay tool, select a range, and set the Step Interval to 1 minute and the Step Rate to 1/Sec.
The chart background will flash Green when a Buy order is placed, Red when a Sell order is placed, and White when a NewBar is started. You can test blocking of repeat orders by manually placing orders in rapid succession. The example code below will only place one Buy and/or Sell order during each bar-period (between White flashes). This method does allow you to take quick profits when both your entry and exit price are hit within one bar period. However you can do this only once per bar.

RequestTimedRefresh); 
ibc GetTradingInterface("IB"); 
Transmit ParamToggle("Transmit","OFF|ON",0); 
BuyTrigger ParamTrigger("Place Buy order","BUY"); 
SellTrigger ParamTrigger("Place Sell order","SELL"); 
Reset ParamTrigger("Reset All","RESET"); 
PrevTN StaticVarGet("TimeNumber"); 
TN LastValue(TimeNum()); 
NewBar TN != PrevTNStaticVarSet("TimeNumber",TN); 
BuyOrderID StaticVarGetText("BuyOrderID"); 
SellOrderID StaticVarGetText("SellOrderID"); 
BuyPending ibc.IsOrderPending(BuyOrderID); 
SellPending ibc.IsOrderPending(SellOrderID); 
if( NewBar ) 
{ 
if( NOT BuyPending StaticVarSetText("BuyOrderID",""); 
if( NOT SellPending StaticVarSetText("SellOrderID",""); 
SetChartBkColorcolorWhite ); 
} 
if( BuyTrigger AND BuyOrderID == "" ) 
{ 
BuyOrderIDibc.ModifyOrderBuyOrderIDName(), "Buy"100"MKT"00"Day"Transmit); 
StaticVarSetText("BuyOrderID",BuyOrderID); 
SetChartBkColorcolorBrightGreen ) ; 
} 
else if( SellTrigger AND SellOrderID == "" ) 
{ 
SellORderID ibc.ModifyOrderSellORderID Name(), "Sell"100"MKT"00"Day"Transmit); 
StaticVarSetText("SellOrderID",SellOrderID); 
SetChartBkColorcolorRed ) ; 
} 
else if( Reset ) 
{ 
StaticVarSetText("BuyOrderID",""); 
if( BuyPending ibc.CancelOrderBuyOrderID ); 
StaticVarSetText("SellOrderID",""); 
if( SellPending ibc.CancelOrderSellOrderID ); 
ibc.CloseAllOpenPositions(); 
} 
LastTWSMsg ibc.getLastError); 
BuyStatus WriteIfBuyOrderID != ""BuyOrderID+", Status: "+ibc.GetStatusBuyORderIDTrue ),""); 
SellStatusWriteIfSellOrderID != ""SellOrderID+", Status: "+ibc.GetStatusSellORderIDTrue ),""); 
LastBuyTimeNz(StaticVarGet("LastBuyTime")); 
LastSellTimeNz(StaticVarGet("LastSellTime")); 
Title "\n""Last TWS Error Msg: "+LastTWSMsg+"\n"" BuyOrderID: "+BuyStatus+"\n"" SellOrderID: "+SellStatus+"\n""TWS Position Size: "+NumToStr(ibc.GetPositionSizeName() ),1.0,False); 
Plot(C,"Close",colorBlack,styleBar); 

Clearing OrderIDs after a Delay

This example maintains a delay between same-type orders. It uses a delay-timer for each type of trade and clears the OrderIDs when the delay times out.
If you set the delay to the bar-interval and if your system clock were synchronized with the market, then this method would give similar results to the NewBar method discussed earlier. However, this method is better since it enables you to place your LMT orders before the Open of the bar, thus giving you a one-quote timing advantage. This may not sound like much, but in fast trading, especially during moderate trading volume, this improves your chances of getting LMT fills.
Again, the best way to test this example is to use a 1-minute database and set your chart to the 5-minute timeframe. Next, open the Bar-Replay tool, select a range, and set the Step Interval to 1 minute and the Step Rate to 1/Sec.
Experiment with the parameter options and observe that you cannot place a same-type order before the delay has timed out (see Chart Title).

RequestTimedRefresh); 
ibc GetTradingInterface("IB"); 
Transmit ParamToggle("Transmit","OFF|ON",0); 
BuyTrigger ParamTrigger("Place Buy order","BUY"); 
BuyLockoutPeriod Param("BuyLockoutPeriod",10,1,300,1); 
SellLockoutPeriod Param("SellLockoutPeriod",10,1,300,1); 
SellTrigger ParamTrigger("Place Sell order","SELL"); 
Reset ParamTrigger("Reset All","RESET"); 
BuyOrderID StaticVarGetText("BuyOrderID"); 
SellOrderID StaticVarGetText("SellOrderID"); 
BuyPending ibc.IsOrderPending(BuyOrderID); 
SellPending ibc.IsOrderPending(SellOrderID); 
RequestTimedRefresh); 
NewSecond Status("redrawaction"); 
if( NewSecond ) 
{ 
BuyCountDown Max0Nz(StaticVarGet("BuyCountDown"))-1); 
StaticVarSet("BuyCountDown"BuyCountDown); 
if( BuyCountDown == AND NOT BuyPending StaticVarSetText("BuyOrderID","");  
SellCountDown Max0Nz(StaticVarGet("SellCountDown"))-1); 
StaticVarSet("SellCountDown"SellCountDown); 
if( SellCountDown == AND NOT SellPending StaticVarSetText("SellOrderID",""); 
} 
BuyCountDown Nz(StaticVarGet("BuyCountDown")); 
SellCountDown Nz(StaticVarGet("SellCountDown")); 
if( BuyTrigger AND ( BuyOrderID == "" AND BuyCountDown == ) ) 
{ 
BuyOrderIDibc.ModifyOrderBuyOrderIDName(), "Buy"100"MKT"00"Day"Transmit); 
StaticVarSetText("BuyOrderID",BuyOrderID); 
StaticVarSet("BuyCountDown"BuyLockoutPeriod); 
SetChartBkColorcolorBrightGreen ); 
} 
else if( SellTrigger AND ( SellOrderID == "" AND SellCountDown == ) ) 
{ 
SellORderID ibc.ModifyOrderSellORderID Name(), "Sell"100"MKT"00"Day"Transmit); 
StaticVarSetText("SellOrderID",SellOrderID); 
StaticVarSet("SellCountDown"SellLockoutPeriod); 
SetChartBkColorcolorRed ); 
} 
else if( Reset ) 
{ 
StaticVarSetText("BuyOrderID",""); 
if( BuyPending ibc.CancelOrderBuyOrderID ); 
StaticVarSetText("SellOrderID",""); 
if( SellPending ibc.CancelOrderSellOrderID ); 
ibc.CloseAllOpenPositions(); 
} 
LastTWSMsg ibc.getLastError); 
BuyStatus WriteIfBuyOrderID != ""BuyOrderID+", Status: "+ibc.GetStatusBuyORderIDTrue ),""); 
SellStatusWriteIfSellOrderID != ""SellOrderID+", Status: "+ibc.GetStatusSellORderIDTrue ),""); 
LastBuyTimeNz(StaticVarGet("LastBuyTime")); 
LastSellTimeNz(StaticVarGet("LastSellTime")); 
Title "\n""Last TWS Error Msg: "+LastTWSMsg+"\n"" BuyOrderID: "+BuyStatus+"\n"" BuyCountDown: "+NumToStr(BuyCountDown,1.0,False)+" Sec.\n"" SellOrderID: "+SellStatus+"\n"" SellCountDown: "+NumToStr(SellCountDown,1.0,False)+" Sec."+"\n"" TWS Position Size: "+NumToStr(ibc.GetPositionSizeName() ),1.0,False); 
Plot(C,"Close",colorBlack,styleBar); 

Alternating Trades

If your system trades LMT orders, you can design your orders to alternate between Long and Short without any limitations.
This method is well suited for reversal systems and high speed trading.
If your limit prices are set properly, this method will allow a fast sequence of reversal trades that can be very profitable. Systems like this may make several trades per minute, sometimes for several minutes, during high volatility.
In the following example, Order Status is checked, and an opposite order is only allowed to pass if the previous order has been filled. Note that this demo does not work if the Transmit ParamToggle is turned Off because under that condition no orders are transmitted to the market and can thus never be filled.
Again, the best way to test this example is to use a 1-minute database and set your chart to the 5-minute timeframe. Next open the Bar-Replay tool, select a range, and set the Step Interval to 1 minute and the Step Rate to 1/Sec.

RequestTimedRefresh); 
ibc GetTradingInterface("IB"); 
Transmit ParamToggle("Transmit","OFF|ON",0); 
Reset ParamTrigger("Reset All","RESET"); 
BuyTrigger ParamTrigger("Place Buy order","BUY"); 
SellTrigger ParamTrigger("Place Sell order","SELL"); 
LastTrade StaticVarGetText("LastTrade"); 
BuyOrderID StaticVarGetText("BuyOrderID"); 
SellOrderID StaticVarGetText("SellOrderID"); 
BuyPending ibc.IsOrderPending(BuyOrderID); 
SellPending ibc.IsOrderPending(SellOrderID); 
IBPosSize ibc.GetPositionSizeName() ); 
BuyStatus ibc.GetStatusBuyORderIDTrue ); 
SellStatus ibc.GetStatusSellORderIDTrue); 
if( BuyTrigger ) 
{  
if( LastTrade == "Sell" OR LastTrade == "" ) 
{ 
if( SellStatus == "Filled" OR SellStatus == "" ) 
{ 
BuyOrderIDibc.ModifyOrderBuyOrderIDName(), "Buy"100"MKT"00"Day"Transmit); 
StaticVarSetText("BuyOrderID",BuyOrderID); 
StaticVarSetText("LastTrade""Buy"); 
SetChartBkColorcolorBrightGreen ) ; 
} 
} 
} 
else if( SellTrigger ) 
{ 
if( LastTrade == "Buy" OR LastTrade == "" ) 
{ 
if( BuyStatus == "Filled" OR BuyStatus == "" ) 
{ 
SellORderID ibc.ModifyOrderSellORderID Name(), "Sell"100"MKT"00"Day"Transmit); 
StaticVarSetText("SellOrderID",SellOrderID); 
StaticVarSetText("LastTrade""Sell"); 
SetChartBkColorcolorRed ) ; 
} 
} 
} 
else if( Reset ) 
{ 
StaticVarSetText("BuyOrderID",""); 
if( BuyPending ibc.CancelOrderBuyOrderID ); 
StaticVarSetText("SellOrderID",""); 
if( SellPending ibc.CancelOrderSellOrderID ); 
StaticVarSetText("LastTrade"""); 
ibc.CloseAllOpenPositions(); 
} 
LastTWSMsg ibc.getLastError); 
//BuyStatus = WriteIf( BuyPending, BuyOrderID+", Status: "+BuyStatus,""); 
//SellStatus= WriteIf( SellPending, SellOrderID+", Status: "+SellStatus,""); 
Title "\n""Last TWS Error Msg: "+LastTWSMsg+"\n"" BuyOrderID: "+BuyOrderID+" "+BuyStatus+"\n"" SellOrderID: "+SellOrderID+" "+SellStatus+"\n"" Last Trade: "+LastTrade+"\n"" TWS Position Size: "+NumToStr(IBPosSize,1.0,False); 
Plot(C,"Close",colorBlack,styleBar); 

Edited by Al Venosa

Adding Manual Test Signals

Testing your AB-IBc-TWS Communication

Besides demonstrating the basics of Automated Trading (AT), the code below may function as a diagnostic tool during AT code development. It often happens that things suddenly stop working, and no orders are transmitted. When this happens, and before you start looking for bugs in your code, you can run this code to verify that your interfacing to the TWS is functional.

For orders to be transmitted to the market you must have entered your “Unlock Code” for the IB Controller in the Unlock window that pops up when you click Files -> Enter Unlock Code. You can obtain your code electronically by following the link to the IBc User Agreement. When you have signed and submitted the User Agreement the Unlock Code will be emailed to you within seconds.

The test code below can be executed from an Indicator window and will test your AB->TWS connection by placing orders from the Param window to your eDemo or Paper Trading account:

Order and TWS Status is displayed in the Title:

If you are using IB?s eDemo, orders may be processed slowly enough for you to observe how the orders are processed.

The code below illustrates several basic but very important aspects of Automated Trading, and it is important to fully understand this code before trying more complex programs. The most important concept to understand is that of the Order ID. The IBc returns a unique OrderID for each order placed. This OrderID can subsequently be used to modify, transmit, cancel, and get status for the order. For any AT system to function properly, OrderIDs must be tracked meticulously at all times. Using an expired OrderID, a non-existing one, or one for an order that is already filled, for example, will lead to API errors.

SetChartOptions2chartWrapTitle );
RequestTimedRefresh);
BuyOrderTrigger ParamTrigger"Place Buy order on TWS""BUY" );
SellOrderTrigger ParamTrigger"Place Sell order on TWS""SELL" );
CancelOrderTrigger ParamTrigger"Cancel order on TWS""CANCEL" );
TransmitTrigger ParamTrigger"Transmit Order""TRANSMIT" );
ibc GetTradingInterface"IB" );
OrderID StaticVarGetText"OrderID" );
ORderStatus ibc.GetStatusORderIDTrue );

if ( BuyOrderTrigger )
{
    OrderID ibc.ModifyOrderOrderIDName(), "Buy"100"MKT"00"Day"TransmitTrigger );
    StaticVarSetText"OrderID"OrderID );
}

if ( SellOrderTrigger )
{
    OrderID ibc.ModifyOrderOrderIDName(), "Sell"100"MKT"00"Day"TransmitTrigger );
    StaticVarSetText"OrderID"OrderID );
}
else
    if ( CancelOrderTrigger )
    {
        OrderID StaticVarGetText"OrderID" );
        ibc.CancelOrderORderID );
    }
    else
        if ( TransmitTrigger )
        {
            if ( ibc.IsOrderPendingORderID ) )
                ibc.TransmitORderID );
        }

OrderID StaticVarGetText"OrderID" );

LastTWSMsg ibc.getLastErrorORderID );
Title "\n" +
        "           OrderID: " ORderID "\n" +
        "Last TWS Error Msg: " LastTWSMsg "\n" +
        "Order Status at IB: " ORderStatus "\n" +
        " TWS Position Size: " NumToStribc.GetPositionSizeName() ), 1.0False );

Edited by Al Venosa

Tips and Tricks

In this post we will collect simple Tips and Tricks that can help you get the most out of this site. You are invited to report new ideas of using this site in a comment to this post.

Searching for a topic
At the top of the Right side-bar is a search window in which you can type keywords to search for. The search is restricted to the title and body of the post and does not include author names. You can also use your browser find button (CTRL-F) to find any string in the displayed browser window. While not really a search you can list all posts in a category and its sub-categories by selecting the category in the Category window located in the middle of the Right side-bar. Posts will be listed by the date they were filed with the most recent post at the top.

Copying AFL Code
For the purpose of clarity and reference AFL Code on this site is formatted with line numbers. These line numbers will not copy when you highlight a section of code. You can directly copy-n-paste AFL code from this side to the AFL formula editor. As the site matures download procedures will be provided to download all code for a selected category. Some posts may also have download links to document and/or AFL files.

Creating a local copy of the UKB
There are many free programs that you can use to download, copy or grab, the entire UKB website. Typically these programs will create an icon on your desktop that gives you fast access to a local copy of the UKB. This off-line local copy will function exactly like the on-line one but respond much faster. It is best for you to do a search and select the website copier you prefer however to get an idea of how they work you can try this free product: HTTrack website copier

Sharing Data over a Private LAN

Questions on this topic are frequently asked on the AmiBroker forums. If you have practical know-how in this area please consider sharing your experience in a brief tutorial.

Running Multiple copies of AmiBroker

Questions on this topic are frequently asked on the AmiBroker forums. If you have practical know-how in this area please consider sharing your experience in a brief tutorial.

Request Real-Time Topics here

You can suggest future topics for the Real-Time Auto-Trading category in a comment to this post.

« Previous Page