Help with code OnPositionOpened not run
Help with code OnPositionOpened not run
12 Jun 2014, 09:27
Hi
Help with code OnPositionOpened not run
i'm test function OnPositionOpened
no modify order or print text
using System; using System.Linq; using cAlgo.API; using cAlgo.API.Indicators; using cAlgo.API.Internals; using cAlgo.Indicators; using System.Collections.Generic; namespace cAlgo.Robots { [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] public class atest : Robot { [Parameter(DefaultValue = 0.0)] public double Parameter { get; set; } public int cBotcc = 0; protected override void OnStart() { // Put your initialization logic here Print("Hi cBot starting."); var result = ExecuteMarketOrder(TradeType.Buy, Symbol, 1000); } protected override void OnTick() { // Put your core logic here Print("Yes! cBot Running On Bid : {0}", Symbol.Bid); cBotcc++; if (cBotcc == Parameter) Stop(); } protected override void OnPositionOpened(Position openedPosition) { if (openedPosition.StopLoss == null) { var stopLoss = openedPosition.EntryPrice - 100 * Symbol.PipSize; ModifyPosition(openedPosition, stopLoss, openedPosition.TakeProfit); Print("Modify Order OK!."); } } protected override void OnStop() { // Put your deinitialization logic here Print("Stop cBot not' run."); } } }
Replies
phajvaj
12 Jun 2014, 09:42
cBot Scalper sample
it running
// ------------------------------------------------------------------------------- // // This is a Template used as a guideline to build your own Robot. // Please use the “Feedback” tab to provide us with your suggestions about cAlgo’s API. // // ------------------------------------------------------------------------------- using System; using cAlgo.API; using cAlgo.API.Indicators; using System.Collections.Generic; namespace cAlgo.Robots { [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] public class Scalper : Robot { [Parameter("BarCount", DefaultValue = 4)] public int BarCount { get; set; } [Parameter("MaxOrders", DefaultValue = 10)] public int MaxOrders { get; set; } [Parameter("TakeProfit", DefaultValue = 100)] public int TakeProfit { get; set; } [Parameter("StopLoss", DefaultValue = 100)] public int StopLoss { get; set; } [Parameter("Volume", DefaultValue = 10000)] public int Volume { get; set; } [Parameter("MaxDropDown", DefaultValue = 0)] public double MaxDropDown { get; set; } [Parameter("MaxProfit", DefaultValue = 0)] public double MaxProfit { get; set; } private int PosOpen = 0; private int OpenIndex = 0; private double StartBalanse; private DateTime dt; protected override void OnStart() { StartBalanse = Account.Balance; dt = Server.Time; } protected override void OnTick() { if (Account.Balance <= 0) Stop(); int last = MarketSeries.Close.Count - 1; if (!(MarketSeries.Open[last] == MarketSeries.High[last] && MarketSeries.Open[last] == MarketSeries.Low[last])) return; if (dt.Date != Server.Time.Date) { StartBalanse = Account.Balance; dt = Server.Time; } double bp = (StartBalanse - Account.Balance) / (StartBalanse / 100); if (bp > 0 && bp >= MaxDropDown && MaxDropDown != 0) return; if (bp < 0 && Math.Abs(bp) >= MaxProfit && MaxProfit != 0) return; if (BarCount < 1) { Print("Мало баров для анализа тренда. BarCount должно быть больше или равно 1"); return; } if (PosOpen < MaxOrders) { if (OpenIndex == 0 || last - OpenIndex > BarCount) { if (IsBuy(last)) { Trade.CreateBuyMarketOrder(Symbol, Volume); PosOpen++; OpenIndex = last; } if (IsSell(last)) { Trade.CreateSellMarketOrder(Symbol, Volume); PosOpen++; OpenIndex = last; } } } } protected override void OnStop() { // Put your deinitialization logic here } protected override void OnPositionOpened(Position openedPosition) { if (openedPosition.TradeType == TradeType.Buy) Trade.ModifyPosition(openedPosition, Symbol.Ask - StopLoss * Symbol.PointSize, Symbol.Ask + TakeProfit * Symbol.PointSize); if (openedPosition.TradeType == TradeType.Sell) Trade.ModifyPosition(openedPosition, Symbol.Bid + StopLoss * Symbol.PointSize, Symbol.Bid - TakeProfit * Symbol.PointSize); } protected override void OnPositionClosed(Position position) { PosOpen--; if (PosOpen < 0) PosOpen = 0; } private bool IsBuy(int last) { for (int i = BarCount; i > 0; i--) { if (MarketSeries.Open[last - i] < MarketSeries.Close[last - i]) return false; if (i < 2) continue; if (MarketSeries.High[last - i] > MarketSeries.High[last - i - 1]) return false; } return true; } private bool IsSell(int last) { for (int i = BarCount; i > 0; i--) { if (MarketSeries.Open[last - i] > MarketSeries.Close[last - i]) return false; if (i < 2) continue; if (MarketSeries.Low[last - i] < MarketSeries.Low[last - i - 1]) return false; } return true; } } }
@phajvaj
phajvaj
12 Jun 2014, 09:49
I understand.
Thanks.
Help with code samples get histoey order in label and symbol
hilp code function OnPositionClosed
/* // A cBot IngDoi from Hmong Thai // Programming by. Phaj Vaj {sAcIw} // Create by. 08-06-14 // Modify by. 11-06-14 // Version 0.0.1 */ using System; using cAlgo.API; using cAlgo.API.Indicators; using System.Collections.Generic; namespace cAlgo.Robots { [Robot(AccessRights = AccessRights.None)] public class aCbotINgDOi : Robot { [Parameter("หมายเลขบอท :", DefaultValue = 1801, MinValue = 0)] public int magics { get; set; } [Parameter("จำนวนวอลุ่ม :", DefaultValue = 1000, MinValue = 1000)] public int InitialVolume { get; set; } [Parameter("จำนวนที่ต้องการคูณ :", DefaultValue = 2, MaxValue = 10, MinValue = 1)] public int multiply { get; set; } [Parameter("จำกัดวอลุ่ม :")] public bool useLimitValume { get; set; } [Parameter("วอลุ่มสูงสุด :", DefaultValue = 5000000, MinValue = 1)] public int LimitVolume { get; set; } [Parameter("SL(pips) ? :", DefaultValue = 35)] public int StopLoss { get; set; } [Parameter("TP(pips) ? :", DefaultValue = 80)] public int TakeProfit { get; set; } [Parameter("ใช้ Tralling :")] public bool useTralling { get; set; } [Parameter("ระยะห่างจากSL(pips) :", DefaultValue = 20.0)] public int Tralling { get; set; } [Parameter("เคลื่อนSL(pips) :", DefaultValue = 10.0)] public int init_StopLoss { get; set; } private Random random = new Random(); private const string botname = "bOt-iNgDOi_"; private const int BUY = 1; private const int SELL = -1; private const int HOLD = 0; private const int BLE = 2; public string cBotname; public bool entryTrade = false; public int countTrade = 0; protected override void OnStart() { cBotname = botname + magics; } protected override void OnTick() { if (Account.Balance <= 0) Stop(); if (Trade.IsExecuting) return; //multiply order //get signal to trade if (Positions.Count == 0 && !entryTrade) { var signal = get_signal(); if (signal == BUY) ExecuteOrder(InitialVolume, TradeType.Buy); if (signal == SELL) ExecuteOrder(InitialVolume, TradeType.Sell); } //Tralling Stop if (useTralling && Positions.Count > 0) get_TrallingStop(); } //End OnTick private void ExecuteOrder(long volume, TradeType tradeType) { var result = ExecuteMarketOrder(tradeType, Symbol, volume, cBotname, StopLoss, TakeProfit); if (result.Error == ErrorCode.NoMoney) { Print("ERROR : ", result.Error); Stop(); } if (result.IsSuccessful) { var position = result.Position; } } protected override void OnPositionClosed(Position position) { Print("Profit : {0}", position.GrossProfit); var volume = (long)position.Volume * multiply; if (position.Label != cBotname || position.SymbolCode != Symbol.Code) return; if (position.GrossProfit < 0) { if (useLimitValume && volume > LimitVolume) volume = LimitVolume; ExecuteOrder(volume, position.TradeType); entryTrade = true; } else entryTrade = false; } private int get_signal() { double close2 = MarketSeries.Close[2]; double close1 = MarketSeries.Close[1]; if (close2 > close1 && random.Next(2) != 0) return (SELL); if (close2 < close1 && random.Next(2) == 0) return BUY; return HOLD; } //CODE Tralling Stop private void get_TrallingStop() { foreach (var position in Positions) { if (Symbol.Code != position.SymbolCode || position.Label != botname) continue; //set initial sotploss if (position.TradeType == TradeType.Sell && position.StopLoss == null) ModifyPosition(position, position.EntryPrice + init_StopLoss * Symbol.PipSize, null); if (position.TradeType == TradeType.Buy && position.StopLoss == null) ModifyPosition(position, position.EntryPrice - init_StopLoss * Symbol.PipSize, null); //tralling stop if (position.GrossProfit <= 0) continue; if (position.TradeType == TradeType.Sell) { double profit1 = position.GrossProfit + position.Commissions - Tralling * 10 * position.Volume / 100000.0; if (profit1 > 0.0 && position.TradeType == TradeType.Sell) { double? TrallingPrice = Symbol.Bid + Tralling * Symbol.PipSize; if (Tralling != 0 && TrallingPrice < position.StopLoss && TrallingPrice < position.EntryPrice) { if (TrallingPrice - Symbol.Bid > 0) { ModifyPosition(position, TrallingPrice, position.TakeProfit); Print("Tralling Stop OK!"); } } } } else { double profit2 = position.GrossProfit + position.Commissions - Tralling * 10 * position.Volume / 100000.0; if (profit2 > 0.0 && position.TradeType == TradeType.Buy) { double? TrallingPrice = Symbol.Ask - Tralling * Symbol.PipSize; if (Tralling != 0 && TrallingPrice > position.StopLoss && TrallingPrice > position.EntryPrice) if (TrallingPrice - Symbol.Ask < 0) { ModifyPosition(position, TrallingPrice, position.TakeProfit); Print("Tralling Stop OK!"); } } } } } //END CODE Tralling Stop } }
@phajvaj
anthony21xu
19 Sep 2018, 14:19
Error CS0672: Member 'cAlgo.Robots.ArtificialIntelligence.OnPositionOpened(cAlgo.API.Position)' overrides obsolete member 'cAlgo.API.Robot.OnPositionOpened(cAlgo.API.Position)'. Add the Obsolete attribute to 'cAlgo.Robots.ArtificialIntelligence.OnPositionOpened(cAlgo.API.Position)'.
i have the same case on 2 bots. Should i change all OnPositionOpened? if so what should i change it to?
@anthony21xu
GoldFishTrader
19 Aug 2021, 12:54
( Updated at: 19 Aug 2021, 12:55 )
Simple BOT
Below is a simple bot that sends an email for every position opened and closed.
Just replace the me@email.com (from/to) with your own email address and the Email body if required. I strongly advise to use your own email server which works best.
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 PositionEmailAlert : Robot
{
[Parameter(DefaultValue = 0.0)]
public double Parameter { get; set; }
protected override void OnStart()
{
// Put your initialization logic here
Positions.Opened += OnPositionsOpened;
Positions.Closed += OnPositionsClosed;
}
void OnPositionsOpened(PositionOpenedEventArgs args)
{
Notifications.SendEmail("me@email.com", "me@email.com", "OPEN TRADE", "Email body");
}
void OnPositionsClosed(PositionClosedEventArgs args)
{
Notifications.SendEmail("me@email.com", "me@email.com", "CLOSE TRADE", "Email body");
}
}
}
@GoldFishTrader
Spotware
12 Jun 2014, 09:31
OnPositionOpened method is obsolete. It works only for old trading API accessible through the Trade object.
In your case you need to subscribe to Positions.Opened event:
@Spotware