Replies

bosma
17 May 2015, 10:05

RE:

I would like some customization to how the optimization algorithm works. Stopping after a given time limit or a certain number of passes (given no improvement in fitness). I wouldn't say it's pointless as is, because you can never be sure you've found the best possible parameters unless brute forcing.

jsuhncc said:

Hi,

Great work on the optimization feature.

Why does the optimizations stop at 2500 passes? Can this be changed some how?

If a user can't get the best possible optimized parameters out of it then it's kind of a pointless feature in it's current state.

Thanks

 


@bosma

bosma
13 May 2015, 03:33

Ticks are a bid and ask, so they include the spread.


@bosma

bosma
11 May 2015, 19:41

It would be great if cAlgo would override System Time while back-testing to equal the time it would have been. I'm not positive what you are trying to do in OnPositionClosed, so I don't get your functionality completely, but something like this would work (have to use 1min charts).

 

// -------------------------------------------------------------------------------------------------
//
//    This code is a cAlgo API sample.
//
//    This cBot is intended to be used as a sample and does not guarantee any particular outcome or
//    profit of any kind. Use it at your own risk
//
//    The "Sample Martingale cBot" creates a random Sell or Buy order. If the Stop loss is hit, a new 
//    order of the same type (Buy / Sell) is created with double the Initial Volume amount. The cBot will 
//    continue to double the volume amount for  all orders created until one of them hits the take Profit. 
//    After a Take Profit is hit, a new random Buy or Sell order is created with the Initial Volume amount.
//
// -------------------------------------------------------------------------------------------------
 
 
using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;
 
namespace cAlgo
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class SampleMartingalecBot : Robot
    {
        [Parameter("Initial Volume", DefaultValue = 10000, MinValue = 0)]
        public int InitialVolume { get; set; }
 
        [Parameter("Stop Loss", DefaultValue = 10)]
        public int StopLoss { get; set; }
 
        [Parameter("Take Profit", DefaultValue = 10)]
        public int TakeProfit { get; set; }
 
        [Parameter("delay minute", DefaultValue = 1)]
        public int Minute { get; set; }
 
        private Random random = new Random();
        
        private DateTime StartTimer;
        private bool OpenAfterTimer = false;
 
        protected override void OnStart()
        {
            Positions.Closed += OnPositionsClosed;
        }
        
        protected override void OnBar()
        {
            // OpenAfterTimer is only true only when a position has been closed (and before another opened)
            if (OpenAfterTimer)
            {
                // If Minute number of minutes has passed
                if (MarketSeries.OpenTime.LastValue.Subtract(StartTimer).TotalMinutes >= Minute)
                    ExecuteOrder(InitialVolume, GetRandomTradeType());
            }
            else
            {
                // Remember when we've opened our position
                StartTimer = MarketSeries.OpenTime.LastValue;
                OpenAfterTimer = false;
                ExecuteOrder(InitialVolume, GetRandomTradeType());
            }
        }
 
        private void ExecuteOrder(long volume, TradeType tradeType)
        {
            var result = ExecuteMarketOrder(tradeType, Symbol, volume, "Martingale", StopLoss, TakeProfit);

            if (result.Error == ErrorCode.NoMoney)
                Stop();
        }
 
        private void OnPositionsClosed(PositionClosedEventArgs args)
        {
            var position = args.Position;
            {
                if (position.Label != "Martingale" || position.SymbolCode != Symbol.Code)
                    return;
                if (position.Pips > 0)
                    OpenAfterTimer = true;
 
                if (position.GrossProfit > 0)
                {
                    ExecuteOrder(InitialVolume, GetRandomTradeType());
                }
                else
                {
                    ExecuteOrder((int)position.Volume * 2, position.TradeType);
                }
            }
        }
 
        private TradeType GetRandomTradeType()
        {
            return random.Next(2) == 0 ? TradeType.Buy : TradeType.Sell;
        }
    }
}

 


@bosma

bosma
11 May 2015, 09:07

/api/reference/functions/hascrossedabove-304a

Functions.HasCrossedAbove(_cci.Result, 200, 1)

or

_cci.Result.HasCrossedAbove(200, 1)

@bosma

bosma
11 May 2015, 08:38

Works fine for me (while optimizing and not).


@bosma

bosma
05 May 2015, 23:56

RE: RE: RE:

 AccessRights = AccessRights.FileSystem

to adhere to principle of least privilege.

benco5000 said:

Fixed:  AccessRights was set to AccessRights.none  changed to AccessRights.FullAccess and it works now.

namespace cAlgo
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)]
    public class myTest : Robot
    {...

 

benco5000 said:

When I run the Writing to File example I get an error message:

 

 

Backtesting Started

Crashed OnStart with Security Exception: Request for the permission of the type 'System.Security.Permissions.FileIOPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.

Backtesting Stopped

Does anyone have any insight?

Thanks in advance.

 

 

 


@bosma