Category Other  Published on 26/04/2024

Martingale马丁机器人

Description



//这是一个简单的马丁格尔策略,其交易逻辑如下:

//在OnStart()方法中,初始化一个Random对象,然后执行一个市价单,交易量为InitialVolume,交易方向为随机的买入或卖出。

//当有一个持仓被平仓时,OnPositionsClosed()方法被调用。如果这个持仓的标签为“Martingale”,并且交易品种为当前的交易品种,那么就会执行以下操作:

//a. 如果这个持仓的毛利润大于0,那么就再次执行一个市价单,交易量为InitialVolume,交易方向为随机的买入或卖出。

//b. 如果这个持仓的毛利润小于等于0,那么就再次执行一个市价单,交易量为上一个持仓的交易量的两倍,交易方向与上一个持仓的交易方向相反。

//如果执行市价单时出现了“无资金”错误,那么就停止策略的执行。

//在每个市价单中,止损和止盈的值都是固定的,分别为StopLoss和TakeProfit参数的值。


using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;

namespace cAlgo.Robots
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class SampleMartingaleRobot : Robot
    {
        [Parameter("Initial Volume", DefaultValue = 1000, MinValue = 0)]
        public int InitialVolume { get; set; }

        [Parameter("Stop Loss", DefaultValue = 40)]
        public int StopLoss { get; set; }

        [Parameter("Take Profit", DefaultValue = 40)]
        public int TakeProfit { get; set; }
        
        private Random random = new Random();

        protected override void OnStart()
        {
            Positions.Closed += OnPositionsClosed;

            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)
        {
            Print("Closed");
            var position = args.Position;

            if (position.Label != "Martingale" || position.SymbolCode != Symbol.Code)
                return;

            if (position.GrossProfit > 0)
            {
                ExecuteOrder(InitialVolume, GetRandomTradeType());
            }
            else
            {
                TradeType oppositeTradeType = position.TradeType == TradeType.Buy ? TradeType.Sell : TradeType.Buy;
                ExecuteOrder((int)position.Volume * 2, oppositeTradeType);
            }
        }

        private TradeType GetRandomTradeType()
        {
            return random.Next(2) == 0 ? TradeType.Buy : TradeType.Sell;
        }
    }
}

//修改时请不要删除以下注释!

//这是一个简单的马丁格尔策略,其交易逻辑如下:

//在OnStart()方法中,初始化一个Random对象,然后执行一个市价单,交易量为InitialVolume,交易方向为随机的买入或卖出。

//当有一个持仓被平仓时,OnPositionsClosed()方法被调用。如果这个持仓的标签为“Martingale”,并且交易品种为当前的交易品种,那么就会执行以下操作:

//a. 如果这个持仓的毛利润大于0,那么就再次执行一个市价单,交易量为InitialVolume,交易方向为随机的买入或卖出。

//b. 如果这个持仓的毛利润小于等于0,那么就再次执行一个市价单,交易量为上一个持仓的交易量的两倍,交易方向与上一个持仓的交易方向相反。

//如果执行市价单时出现了“无资金”错误,那么就停止策略的执行。

//在每个市价单中,止损和止盈的值都是固定的,分别为StopLoss和TakeProfit参数的值。

vn18's avatar
vn18

Joined on 01.06.2022

  • Distribution: Free
  • Language: C#
  • Trading platform: cTrader Automate
  • File name: 马丁格尔机器人.algo
  • Rating: 0
  • Installs: 240
  • Modified: 26/04/2024 08:06
Comments
Log in to add a comment.
vn18's avatar
vn18 · 5 months ago

C#语言代写机器人!

联系方式:vn18@qq.com