2 pending orders per period

Created at 30 Aug 2018, 21:37
How’s your experience with the cTrader Platform?
Your feedback is crucial to cTrader's development. Please take a few seconds to share your opinion and help us improve your trading experience. Thanks!
MA

mathmaia

Joined 30.08.2018

2 pending orders per period
30 Aug 2018, 21:37


Hi,

 

I need to make my cbot open 2 pending orders one BUY and one Sell order on each bar, if I put true in the "if no orders" field it only opens one order, if I put it false it opens hundreds of identical orders, such as making it understand that I only want 1 purchase and 1 sale per period? Thsanks.

@mathmaia
Replies

mathmaia
30 Aug 2018, 21:39

RE:

 

Hi,

 

I need to make my cbot open 2 pending orders one BUY and one Sell order on each bar, if I put true in the "if no orders" field it only opens one order, if I put it false it opens hundreds of identical orders, such as making it understand that I only want 1 purchase and 1 sale per period? Thsanks.

@mathmaia

PanagiotisCharalampous
31 Aug 2018, 10:37

Ηi mathmaia,

Can you post your code so that we can check what the issue is?

Best Regards,

Panagiotis


@PanagiotisCharalampous

mathmaia
31 Aug 2018, 17:32

//+------------------------------------------------------------------+
//+                           Code generated using FxPro Quant 2.1.4 |
//+------------------------------------------------------------------+

using System;
using System.Threading;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.API.Requests;
using cAlgo.Indicators;


namespace cAlgo.Robots
{
   [Robot(TimeZone = TimeZones.UTC)]
   public class Prototype : Robot
   {

      [Parameter("Risk",DefaultValue=0.032)] 
      public double _Risk { get; set; }

      //Global declaration
      double _Entry_Price_BUY;
      double _Stop_Loss;
      double _Stop_Loss_4;

DateTime LastTradeExecution = new DateTime(0);

      protected override void OnStart()
      {

      }

      protected override void OnTick() 
      {
         if (Trade.IsExecuting) return;

         //Local declaration
         TriState _Send_Pending = new TriState();
         TriState _Send_Pending_4 = new TriState();

         //Step 1

         //Step 2
         _Entry_Price_BUY = (MarketSeries.High.Last(1) + (0.0003));

         //Step 3

         //Step 4

         //Step 5

         //Step 6
         _Stop_Loss = ((Math.Abs((_Entry_Price_BUY - (MarketSeries.Low.Last(1)))) * (100000)) + (20));
         _Stop_Loss_4 = ((Math.Abs(((MarketSeries.Low.Last(1) - (0.0003)) - (MarketSeries.High.Last(1)))) * (100000)) + (20));

         //Step 7

         //Step 8

         //Step 9

         //Step 10
            if( (MarketSeries.TickVolume.LastValue == 1) ) _Send_Pending = _SendPending(0,false,Symbol.Code,PendingOrderType.Stop,TradeType.Buy,Math.Round((((Account.Balance * (_Risk)) / (_Stop_Loss)) * (1)) * Math.Pow(10, 2))/Math.Pow(10,2),0,_Entry_Price_BUY,_Stop_Loss,(_Stop_Loss * (1.55)),DateTime.Parse("1970.01.01 00:00:00"),""); 
            if( (MarketSeries.TickVolume.LastValue == 1) ) _Send_Pending_4 = _SendPending(0,false,Symbol.Code,PendingOrderType.Stop,TradeType.Sell,Math.Round((((Account.Balance * (_Risk)) / (_Stop_Loss_4)) * (1)) * Math.Pow(10, 2))/Math.Pow(10,2),0,(MarketSeries.Low.Last(1) - (0.0003)),_Stop_Loss_4,(_Stop_Loss_4 * (1.55)),DateTime.Parse("1970.01.01 00:00:00"),""); 

      }

bool NoOrders(string symbolCode, double[] magicIndecies){if (symbolCode == "")symbolCode = Symbol.Code;string[] labels = new string[magicIndecies.Length];for (int i = 0; i < magicIndecies.Length; i++){labels[i] = "FxProQuant_" + magicIndecies[i].ToString("F0");}foreach (Position pos in Positions){if (pos.SymbolCode != symbolCode)continue;if (labels.Length == 0)return false;foreach (var label in labels){if (pos.Label == label)return false;}}foreach (PendingOrder po in PendingOrders){if (po.SymbolCode != symbolCode)continue;if (labels.Length == 0)return false;foreach (var label in labels){if (po.Label == label)return false;}}return true;}

TriState _OpenPosition(double magicIndex, bool noOrders, string symbolCode, TradeType tradeType, double lots, double slippage, double? stopLoss, double? takeProfit, string comment){Symbol symbol = (Symbol.Code == symbolCode) ? Symbol : MarketData.GetSymbol(symbolCode);if (noOrders && Positions.Find("FxProQuant_" + magicIndex.ToString("F0"), symbol) != null)return new TriState();if (stopLoss < 1)stopLoss = null;if (takeProfit < 1)takeProfit=null;if(symbol.Digits==5||symbol.Digits == 3){if (stopLoss != null)stopLoss /= 10;if (takeProfit != null)takeProfit /= 10;slippage /= 10;}int volume = Convert.ToInt32(lots * 100000);if (!ExecuteMarketOrder(tradeType, symbol, volume, "FxProQuant_" + magicIndex.ToString("F0"), stopLoss, takeProfit, slippage, comment).IsSuccessful){Thread.Sleep(400);return false;}return true;}

TriState _SendPending(double magicIndex, bool noOrders, string symbolCode, PendingOrderType poType, TradeType tradeType, double lots, int priceAction, double priceValue, double? stopLoss, double? takeProfit,DateTime? expiration, string comment){Symbol symbol = (Symbol.Code == symbolCode) ? Symbol : MarketData.GetSymbol(symbolCode);if (noOrders && PendingOrders.__Find("FxProQuant_" + magicIndex.ToString("F0"), symbol) != null)return new TriState();if (stopLoss < 1)stopLoss = null;if (takeProfit < 1)takeProfit = null;if (symbol.Digits == 5 || symbol.Digits == 3){if (stopLoss != null)stopLoss /= 10;if (takeProfit != null)takeProfit /= 10;}int volume = Convert.ToInt32(lots * 100000);double targetPrice;switch (priceAction){case 0:targetPrice = priceValue;break;case 1:targetPrice = symbol.Bid - priceValue * symbol.TickSize;break;case 2:targetPrice = symbol.Bid + priceValue * symbol.TickSize;break;case 3:targetPrice = symbol.Ask - priceValue * symbol.TickSize;break;case 4:targetPrice = symbol.Ask + priceValue * symbol.TickSize;break;default:targetPrice = priceValue;break;}if (expiration.HasValue && (expiration.Value.Ticks == 0 || expiration.Value == DateTime.Parse("1970.01.01 00:00:00")))expiration = null;if (poType == PendingOrderType.Limit){if (!PlaceLimitOrder(tradeType, symbol, volume, targetPrice, "FxProQuant_" + magicIndex.ToString("F0"), stopLoss, takeProfit, expiration, comment).IsSuccessful){Thread.Sleep(400);return false;}return true;}else if (poType == PendingOrderType.Stop){if (!PlaceStopOrder(tradeType, symbol, volume, targetPrice, "FxProQuant_" + magicIndex.ToString("F0"), stopLoss, takeProfit, expiration, comment).IsSuccessful){Thread.Sleep(400);return false;}return true;}return new TriState();}

TriState _ModifyPosition(double magicIndex, string symbolCode, int slAction, double slValue, int tpAction, double tpValue){Symbol symbol = (Symbol.Code == symbolCode) ? Symbol : MarketData.GetSymbol(symbolCode);var pos = Positions.Find("FxProQuant_" + magicIndex.ToString("F0"), symbol);if (pos == null)return new TriState();double? sl, tp;if (slValue == 0)sl = null;else{switch (slAction){case 0:sl = pos.StopLoss;break;case 1:if (pos.TradeType == TradeType.Buy)sl = pos.EntryPrice - slValue * symbol.TickSize;else sl = pos.EntryPrice + slValue * symbol.TickSize;break;case 2:sl = slValue;break;default:sl = pos.StopLoss;break;}}if (tpValue == 0)tp = null;else{switch (tpAction){case 0:tp = pos.TakeProfit;break;case 1:if (pos.TradeType == TradeType.Buy)tp = pos.EntryPrice + tpValue * symbol.TickSize;else tp = pos.EntryPrice - tpValue * symbol.TickSize;break;case 2:tp = tpValue;break;default:tp = pos.TakeProfit;break;}}if (!ModifyPosition(pos, sl, tp).IsSuccessful){Thread.Sleep(400);return false;}return true;}

TriState _ModifyPending(double magicIndex, string symbolCode, int slAction, double slValue, int tpAction, double tpValue, int priceAction, double priceValue, int expirationAction, DateTime? expiration){Symbol symbol = (Symbol.Code == symbolCode) ? Symbol : MarketData.GetSymbol(symbolCode);var po = PendingOrders.__Find("FxProQuant_" + magicIndex.ToString("F0"), symbol);if (po == null)return new TriState();double targetPrice;double? sl, tp;if (slValue == 0)sl = null;else{switch (slAction){case 0:sl = po.StopLoss;break;case 1:if (po.TradeType == TradeType.Buy)sl = po.TargetPrice - slValue * symbol.TickSize;else sl = po.TargetPrice + slValue * symbol.TickSize;break;case 2:sl = slValue;break;default:sl = po.StopLoss;break;}}if (tpValue == 0)tp = null;else{switch (tpAction){case 0:tp = po.TakeProfit;break;case 1:if (po.TradeType == TradeType.Buy)tp = po.TargetPrice + tpValue * symbol.TickSize;else tp = po.TargetPrice - tpValue * symbol.TickSize;break;case 2:tp = tpValue;break;default:tp = po.TakeProfit;break;}}switch (priceAction){case 0:targetPrice = po.TargetPrice;break;case 1:targetPrice = priceValue;break;case 2:targetPrice = po.TargetPrice + priceValue * symbol.TickSize;break;case 3:targetPrice = po.TargetPrice - priceValue * symbol.TickSize;break;case 4:targetPrice = symbol.Bid - priceValue * symbol.TickSize;break;case 5:targetPrice = symbol.Bid + priceValue * symbol.TickSize;break;case 6:targetPrice = symbol.Ask - priceValue * symbol.TickSize;break;case 7:targetPrice = symbol.Ask + priceValue * symbol.TickSize;break;default:targetPrice = po.TargetPrice;break;}if (expiration.HasValue && (expiration.Value.Ticks == 0 || expiration.Value == DateTime.Parse("1970.01.01 00:00:00")))expiration = null;if (expirationAction == 0)expiration = po.ExpirationTime;if (!ModifyPendingOrder(po, targetPrice, sl, tp, expiration).IsSuccessful){Thread.Sleep(400);return false;}return true;}

TriState _ClosePosition(double magicIndex, string symbolCode, double lots){Symbol symbol = (Symbol.Code == symbolCode) ? Symbol : MarketData.GetSymbol(symbolCode);var pos = Positions.Find("FxProQuant_" + magicIndex.ToString("F0"), symbol);if (pos == null)return new TriState();TradeResult result;if (lots == 0){result = ClosePosition(pos);}else{int volume = Convert.ToInt32(lots * 100000);result = ClosePosition(pos, volume);}if (!result.IsSuccessful){Thread.Sleep(400);return false;}return true;}

TriState _DeletePending(double magicIndex, string symbolCode){Symbol symbol = (Symbol.Code == symbolCode)?Symbol:MarketData.GetSymbol(symbolCode);var po=PendingOrders.__Find("FxProQuant_" + magicIndex.ToString("F0"), symbol);if (po == null)return new TriState();if (!CancelPendingOrder(po).IsSuccessful){Thread.Sleep(400);return false;}return true;}

bool _OrderStatus(double magicIndex, string symbolCode, int test){Symbol symbol=(Symbol.Code==symbolCode)?Symbol:MarketData.GetSymbol(symbolCode);var pos=Positions.Find("FxProQuant_" + magicIndex.ToString("F0"), symbol);if (pos != null){if (test == 0)return true;if (test == 1)return true;if (test == 3)return pos.TradeType == TradeType.Buy;if (test == 4)return pos.TradeType == TradeType.Sell;}var po = PendingOrders.__Find("FxProQuant_" + magicIndex.ToString("F0"), symbol);if (po != null){if (test == 0)return true;if (test == 2)return true;if (test == 3)return po.TradeType == TradeType.Buy;if (test == 4)return po.TradeType == TradeType.Sell;if (test == 5)return po.OrderType == PendingOrderType.Limit;if (test == 6)return po.OrderType == PendingOrderType.Stop;}return false;}

int TimeframeToInt(TimeFrame tf){if(tf == TimeFrame.Minute) return 1;else if (tf == TimeFrame.Minute2) return 2;else if (tf == TimeFrame.Minute3) return 3;else if (tf == TimeFrame.Minute4) return 4;else if (tf == TimeFrame.Minute5) return 5;else if (tf == TimeFrame.Minute10) return 10;else if (tf == TimeFrame.Minute15) return 15;else if (tf == TimeFrame.Minute30) return 30;else if (tf == TimeFrame.Hour) return 60;else if (tf == TimeFrame.Hour4) return 240;else if (tf == TimeFrame.Daily) return 1440;else if (tf == TimeFrame.Weekly) return 10080;else if (tf == TimeFrame.Monthly) return 43200;return 1;}


DateTime __currentBarTime = DateTime.MinValue;
bool __isNewBar(bool triggerAtStart)
{
    DateTime newTime = MarketSeries.OpenTime.LastValue;
    if (__currentBarTime != newTime)
    {
        if (!triggerAtStart && __currentBarTime == DateTime.MinValue)
        {
            __currentBarTime = newTime;
            return false;
        }
        __currentBarTime = newTime;
        return true;
    }
    return false;
}
   
}
}

public struct TriState{public static readonly TriState NonExecution = new TriState(0);public static readonly TriState False = new TriState(-1);public static readonly TriState True = new TriState(1);sbyte value;TriState(int value){this.value = (sbyte)value;}public bool IsNonExecution{get { return value == 0; }}public static implicit operator TriState(bool x){return x ? True : False;}public static TriState operator ==(TriState x, TriState y){if (x.value == 0 || y.value == 0)return NonExecution;return x.value == y.value ? True : False;}public static TriState operator !=(TriState x, TriState y){if (x.value == 0 || y.value == 0)return NonExecution;return x.value != y.value ? True : False;}public static TriState operator !(TriState x){return new TriState(-x.value);}public static TriState operator &(TriState x, TriState y){return new TriState(x.value < y.value ? x.value : y.value);}public static TriState operator |(TriState x, TriState y){return new TriState(x.value > y.value ? x.value : y.value);}public static bool operator true(TriState x){return x.value > 0;}public static bool operator false(TriState x){return x.value < 0;}public static implicit operator bool(TriState x){return x.value > 0;}public override bool Equals(object obj){if (!(obj is TriState))return false;return value == ((TriState)obj).value;}public override int GetHashCode(){return value;}public override string ToString(){if (value > 0)return "True";if (value < 0)return "False";return "NonExecution";}}

public static class PendingEx{public static PendingOrder __Find(this cAlgo.API.PendingOrders pendingOrders, string label, Symbol symbol){foreach (PendingOrder po in pendingOrders){if (po.SymbolCode == symbol.Code && po.Label == label)return po;}return null;}}


@mathmaia

mathmaia
31 Aug 2018, 17:33

//+------------------------------------------------------------------+
//+                           Code generated using FxPro Quant 2.1.4 |
//+------------------------------------------------------------------+

using System;
using System.Threading;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.API.Requests;
using cAlgo.Indicators;


namespace cAlgo.Robots
{
    [Robot(TimeZone = TimeZones.UTC)]
    public class Prototype : Robot
    {

        [Parameter("Risk", DefaultValue = 0.032)]
        public double _Risk { get; set; }

        //Global declaration
        double _Entry_Price_BUY;
        double _Stop_Loss;
        double _Stop_Loss_4;

        DateTime LastTradeExecution = new DateTime(0);

        protected override void OnStart()
        {

        }

        protected override void OnTick()
        {
            if (Trade.IsExecuting)
                return;

            //Local declaration
            TriState _Send_Pending = new TriState();
            TriState _Send_Pending_4 = new TriState();

            //Step 1

            //Step 2
            _Entry_Price_BUY = (MarketSeries.High.Last(1) + (0.0003));

            //Step 3

            //Step 4

            //Step 5

            //Step 6
            _Stop_Loss = ((Math.Abs((_Entry_Price_BUY - (MarketSeries.Low.Last(1)))) * (100000)) + (20));
            _Stop_Loss_4 = ((Math.Abs(((MarketSeries.Low.Last(1) - (0.0003)) - (MarketSeries.High.Last(1)))) * (100000)) + (20));

            //Step 7

            //Step 8

            //Step 9

            //Step 10
            if ((MarketSeries.TickVolume.LastValue == 1))
                _Send_Pending = _SendPending(0, false, Symbol.Code, PendingOrderType.Stop, TradeType.Buy, Math.Round((((Account.Balance * (_Risk)) / (_Stop_Loss)) * (1)) * Math.Pow(10, 2)) / Math.Pow(10, 2), 0, _Entry_Price_BUY, _Stop_Loss, (_Stop_Loss * (1.55)),
                DateTime.Parse("1970.01.01 00:00:00"), "");
            if ((MarketSeries.TickVolume.LastValue == 1))
                _Send_Pending_4 = _SendPending(0, false, Symbol.Code, PendingOrderType.Stop, TradeType.Sell, Math.Round((((Account.Balance * (_Risk)) / (_Stop_Loss_4)) * (1)) * Math.Pow(10, 2)) / Math.Pow(10, 2), 0, (MarketSeries.Low.Last(1) - (0.0003)), _Stop_Loss_4, (_Stop_Loss_4 * (1.55)),
                DateTime.Parse("1970.01.01 00:00:00"), "");

        }

        bool NoOrders(string symbolCode, double[] magicIndecies)
        {
            if (symbolCode == "")
                symbolCode = Symbol.Code;
            string[] labels = new string[magicIndecies.Length];
            for (int i = 0; i < magicIndecies.Length; i++)
            {
                labels[i] = "FxProQuant_" + magicIndecies[i].ToString("F0");
            }
            foreach (Position pos in Positions)
            {
                if (pos.SymbolCode != symbolCode)
                    continue;
                if (labels.Length == 0)
                    return false;
                foreach (var label in labels)
                {
                    if (pos.Label == label)
                        return false;
                }
            }
            foreach (PendingOrder po in PendingOrders)
            {
                if (po.SymbolCode != symbolCode)
                    continue;
                if (labels.Length == 0)
                    return false;
                foreach (var label in labels)
                {
                    if (po.Label == label)
                        return false;
                }
            }
            return true;
        }

        TriState _OpenPosition(double magicIndex, bool noOrders, string symbolCode, TradeType tradeType, double lots, double slippage, double? stopLoss, double? takeProfit, string comment)
        {
            Symbol symbol = (Symbol.Code == symbolCode) ? Symbol : MarketData.GetSymbol(symbolCode);
            if (noOrders && Positions.Find("FxProQuant_" + magicIndex.ToString("F0"), symbol) != null)
                return new TriState();
            if (stopLoss < 1)
                stopLoss = null;
            if (takeProfit < 1)
                takeProfit = null;
            if (symbol.Digits == 5 || symbol.Digits == 3)
            {
                if (stopLoss != null)
                    stopLoss /= 10;
                if (takeProfit != null)
                    takeProfit /= 10;
                slippage /= 10;
            }
            int volume = Convert.ToInt32(lots * 100000);
            if (!ExecuteMarketOrder(tradeType, symbol, volume, "FxProQuant_" + magicIndex.ToString("F0"), stopLoss, takeProfit, slippage, comment).IsSuccessful)
            {
                Thread.Sleep(400);
                return false;
            }
            return true;
        }

        TriState _SendPending(double magicIndex, bool noOrders, string symbolCode, PendingOrderType poType, TradeType tradeType, double lots, int priceAction, double priceValue, double? stopLoss, double? takeProfit,
        DateTime? expiration, string comment)
        {
            Symbol symbol = (Symbol.Code == symbolCode) ? Symbol : MarketData.GetSymbol(symbolCode);
            if (noOrders && PendingOrders.__Find("FxProQuant_" + magicIndex.ToString("F0"), symbol) != null)
                return new TriState();
            if (stopLoss < 1)
                stopLoss = null;
            if (takeProfit < 1)
                takeProfit = null;
            if (symbol.Digits == 5 || symbol.Digits == 3)
            {
                if (stopLoss != null)
                    stopLoss /= 10;
                if (takeProfit != null)
                    takeProfit /= 10;
            }
            int volume = Convert.ToInt32(lots * 100000);
            double targetPrice;
            switch (priceAction)
            {
                case 0:
                    targetPrice = priceValue;
                    break;
                case 1:
                    targetPrice = symbol.Bid - priceValue * symbol.TickSize;
                    break;
                case 2:
                    targetPrice = symbol.Bid + priceValue * symbol.TickSize;
                    break;
                case 3:
                    targetPrice = symbol.Ask - priceValue * symbol.TickSize;
                    break;
                case 4:
                    targetPrice = symbol.Ask + priceValue * symbol.TickSize;
                    break;
                default:
                    targetPrice = priceValue;
                    break;
            }
            if (expiration.HasValue && (expiration.Value.Ticks == 0 || expiration.Value == DateTime.Parse("1970.01.01 00:00:00")))
                expiration = null;
            if (poType == PendingOrderType.Limit)
            {
                if (!PlaceLimitOrder(tradeType, symbol, volume, targetPrice, "FxProQuant_" + magicIndex.ToString("F0"), stopLoss, takeProfit, expiration, comment).IsSuccessful)
                {
                    Thread.Sleep(400);
                    return false;
                }
                return true;
            }
            else if (poType == PendingOrderType.Stop)
            {
                if (!PlaceStopOrder(tradeType, symbol, volume, targetPrice, "FxProQuant_" + magicIndex.ToString("F0"), stopLoss, takeProfit, expiration, comment).IsSuccessful)
                {
                    Thread.Sleep(400);
                    return false;
                }
                return true;
            }
            return new TriState();
        }

        TriState _ModifyPosition(double magicIndex, string symbolCode, int slAction, double slValue, int tpAction, double tpValue)
        {
            Symbol symbol = (Symbol.Code == symbolCode) ? Symbol : MarketData.GetSymbol(symbolCode);
            var pos = Positions.Find("FxProQuant_" + magicIndex.ToString("F0"), symbol);
            if (pos == null)
                return new TriState();
            double? sl, tp;
            if (slValue == 0)
                sl = null;
            else
            {
                switch (slAction)
                {
                    case 0:
                        sl = pos.StopLoss;
                        break;
                    case 1:
                        if (pos.TradeType == TradeType.Buy)
                            sl = pos.EntryPrice - slValue * symbol.TickSize;
                        else
                            sl = pos.EntryPrice + slValue * symbol.TickSize;
                        break;
                    case 2:
                        sl = slValue;
                        break;
                    default:
                        sl = pos.StopLoss;
                        break;
                }
            }
            if (tpValue == 0)
                tp = null;
            else
            {
                switch (tpAction)
                {
                    case 0:
                        tp = pos.TakeProfit;
                        break;
                    case 1:
                        if (pos.TradeType == TradeType.Buy)
                            tp = pos.EntryPrice + tpValue * symbol.TickSize;
                        else
                            tp = pos.EntryPrice - tpValue * symbol.TickSize;
                        break;
                    case 2:
                        tp = tpValue;
                        break;
                    default:
                        tp = pos.TakeProfit;
                        break;
                }
            }
            if (!ModifyPosition(pos, sl, tp).IsSuccessful)
            {
                Thread.Sleep(400);
                return false;
            }
            return true;
        }

        TriState _ModifyPending(double magicIndex, string symbolCode, int slAction, double slValue, int tpAction, double tpValue, int priceAction, double priceValue, int expirationAction, DateTime? expiration)
        {
            Symbol symbol = (Symbol.Code == symbolCode) ? Symbol : MarketData.GetSymbol(symbolCode);
            var po = PendingOrders.__Find("FxProQuant_" + magicIndex.ToString("F0"), symbol);
            if (po == null)
                return new TriState();
            double targetPrice;
            double? sl, tp;
            if (slValue == 0)
                sl = null;
            else
            {
                switch (slAction)
                {
                    case 0:
                        sl = po.StopLoss;
                        break;
                    case 1:
                        if (po.TradeType == TradeType.Buy)
                            sl = po.TargetPrice - slValue * symbol.TickSize;
                        else
                            sl = po.TargetPrice + slValue * symbol.TickSize;
                        break;
                    case 2:
                        sl = slValue;
                        break;
                    default:
                        sl = po.StopLoss;
                        break;
                }
            }
            if (tpValue == 0)
                tp = null;
            else
            {
                switch (tpAction)
                {
                    case 0:
                        tp = po.TakeProfit;
                        break;
                    case 1:
                        if (po.TradeType == TradeType.Buy)
                            tp = po.TargetPrice + tpValue * symbol.TickSize;
                        else
                            tp = po.TargetPrice - tpValue * symbol.TickSize;
                        break;
                    case 2:
                        tp = tpValue;
                        break;
                    default:
                        tp = po.TakeProfit;
                        break;
                }
            }
            switch (priceAction)
            {
                case 0:
                    targetPrice = po.TargetPrice;
                    break;
                case 1:
                    targetPrice = priceValue;
                    break;
                case 2:
                    targetPrice = po.TargetPrice + priceValue * symbol.TickSize;
                    break;
                case 3:
                    targetPrice = po.TargetPrice - priceValue * symbol.TickSize;
                    break;
                case 4:
                    targetPrice = symbol.Bid - priceValue * symbol.TickSize;
                    break;
                case 5:
                    targetPrice = symbol.Bid + priceValue * symbol.TickSize;
                    break;
                case 6:
                    targetPrice = symbol.Ask - priceValue * symbol.TickSize;
                    break;
                case 7:
                    targetPrice = symbol.Ask + priceValue * symbol.TickSize;
                    break;
                default:
                    targetPrice = po.TargetPrice;
                    break;
            }
            if (expiration.HasValue && (expiration.Value.Ticks == 0 || expiration.Value == DateTime.Parse("1970.01.01 00:00:00")))
                expiration = null;
            if (expirationAction == 0)
                expiration = po.ExpirationTime;
            if (!ModifyPendingOrder(po, targetPrice, sl, tp, expiration).IsSuccessful)
            {
                Thread.Sleep(400);
                return false;
            }
            return true;
        }

        TriState _ClosePosition(double magicIndex, string symbolCode, double lots)
        {
            Symbol symbol = (Symbol.Code == symbolCode) ? Symbol : MarketData.GetSymbol(symbolCode);
            var pos = Positions.Find("FxProQuant_" + magicIndex.ToString("F0"), symbol);
            if (pos == null)
                return new TriState();
            TradeResult result;
            if (lots == 0)
            {
                result = ClosePosition(pos);
            }
            else
            {
                int volume = Convert.ToInt32(lots * 100000);
                result = ClosePosition(pos, volume);
            }
            if (!result.IsSuccessful)
            {
                Thread.Sleep(400);
                return false;
            }
            return true;
        }

        TriState _DeletePending(double magicIndex, string symbolCode)
        {
            Symbol symbol = (Symbol.Code == symbolCode) ? Symbol : MarketData.GetSymbol(symbolCode);
            var po = PendingOrders.__Find("FxProQuant_" + magicIndex.ToString("F0"), symbol);
            if (po == null)
                return new TriState();
            if (!CancelPendingOrder(po).IsSuccessful)
            {
                Thread.Sleep(400);
                return false;
            }
            return true;
        }

        bool _OrderStatus(double magicIndex, string symbolCode, int test)
        {
            Symbol symbol = (Symbol.Code == symbolCode) ? Symbol : MarketData.GetSymbol(symbolCode);
            var pos = Positions.Find("FxProQuant_" + magicIndex.ToString("F0"), symbol);
            if (pos != null)
            {
                if (test == 0)
                    return true;
                if (test == 1)
                    return true;
                if (test == 3)
                    return pos.TradeType == TradeType.Buy;
                if (test == 4)
                    return pos.TradeType == TradeType.Sell;
            }
            var po = PendingOrders.__Find("FxProQuant_" + magicIndex.ToString("F0"), symbol);
            if (po != null)
            {
                if (test == 0)
                    return true;
                if (test == 2)
                    return true;
                if (test == 3)
                    return po.TradeType == TradeType.Buy;
                if (test == 4)
                    return po.TradeType == TradeType.Sell;
                if (test == 5)
                    return po.OrderType == PendingOrderType.Limit;
                if (test == 6)
                    return po.OrderType == PendingOrderType.Stop;
            }
            return false;
        }

        int TimeframeToInt(TimeFrame tf)
        {
            if (tf == TimeFrame.Minute)
                return 1;
            else if (tf == TimeFrame.Minute2)
                return 2;
            else if (tf == TimeFrame.Minute3)
                return 3;
            else if (tf == TimeFrame.Minute4)
                return 4;
            else if (tf == TimeFrame.Minute5)
                return 5;
            else if (tf == TimeFrame.Minute10)
                return 10;
            else if (tf == TimeFrame.Minute15)
                return 15;
            else if (tf == TimeFrame.Minute30)
                return 30;
            else if (tf == TimeFrame.Hour)
                return 60;
            else if (tf == TimeFrame.Hour4)
                return 240;
            else if (tf == TimeFrame.Daily)
                return 1440;
            else if (tf == TimeFrame.Weekly)
                return 10080;
            else if (tf == TimeFrame.Monthly)
                return 43200;
            return 1;
        }


        DateTime __currentBarTime = DateTime.MinValue;
        bool __isNewBar(bool triggerAtStart)
        {
            DateTime newTime = MarketSeries.OpenTime.LastValue;
            if (__currentBarTime != newTime)
            {
                if (!triggerAtStart && __currentBarTime == DateTime.MinValue)
                {
                    __currentBarTime = newTime;
                    return false;
                }
                __currentBarTime = newTime;
                return true;
            }
            return false;
        }

    }
}

public struct TriState
{
    public static readonly TriState NonExecution = new TriState(0);
    public static readonly TriState False = new TriState(-1);
    public static readonly TriState True = new TriState(1);
    sbyte value;
    TriState(int value)
    {
        this.value = (sbyte)value;
    }
    public bool IsNonExecution
    {
        get { return value == 0; }
    }
    public static implicit operator TriState(bool x)
    {
        return x ? True : False;
    }
    public static TriState operator ==(TriState x, TriState y)
    {
        if (x.value == 0 || y.value == 0)
            return NonExecution;
        return x.value == y.value ? True : False;
    }
    public static TriState operator !=(TriState x, TriState y)
    {
        if (x.value == 0 || y.value == 0)
            return NonExecution;
        return x.value != y.value ? True : False;
    }
    public static TriState operator !(TriState x)
    {
        return new TriState(-x.value);
    }
    public static TriState operator &(TriState x, TriState y)
    {
        return new TriState(x.value < y.value ? x.value : y.value);
    }
    public static TriState operator |(TriState x, TriState y)
    {
        return new TriState(x.value > y.value ? x.value : y.value);
    }
    public static bool operator true(TriState x)
    {
        return x.value > 0;
    }
    public static bool operator false(TriState x)
    {
        return x.value < 0;
    }
    public static implicit operator bool(TriState x)
    {
        return x.value > 0;
    }
    public override bool Equals(object obj)
    {
        if (!(obj is TriState))
            return false;
        return value == ((TriState)obj).value;
    }
    public override int GetHashCode()
    {
        return value;
    }
    public override string ToString()
    {
        if (value > 0)
            return "True";
        if (value < 0)
            return "False";
        return "NonExecution";
    }
}

public static class PendingEx
{
    public static PendingOrder __Find(this cAlgo.API.PendingOrders pendingOrders, string label, Symbol symbol)
    {
        foreach (PendingOrder po in pendingOrders)
        {
            if (po.SymbolCode == symbol.Code && po.Label == label)
                return po;
        }
        return null;
    }
}


@mathmaia