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:
protected override void OnStart() { Positions.Opened += OnPositionsOpened; } void OnPositionsOpened(PositionOpenedEventArgs args) { ... }@Spotware