| 
namespace cAlgo.Robots
 {
 [Robot(" Forex")]
 public class Forex : Robot
 {
 [Parameter(DefaultValue = 10000)]
 public int FirstLot { get; set; }
 
 [Parameter("Take_Profit", DefaultValue = 300)]
 public int TakeProfit { get; set; }
 
 [Parameter("Tral_Start", DefaultValue = 50)]
 public int Tral_Start { get; set; }
 
 [Parameter("Tral_Stop", DefaultValue = 50)]
 public int Tral_Stop { get; set; }
 
 [Parameter(DefaultValue = 500)]
 public int PipStep { get; set; }
 
 [Parameter(DefaultValue = 3, MinValue = 2)]
 public int MaxOrders { get; set; }
 
 private Position position;
 private int LotStep=10000;
 private double startingBalance;
 private const double BalancePercent = 0.50;
 
 
 protected override void OnStart()
 
 {
 
 startingBalance = Account.Balance;
 
 }
 
 protected override void OnTick()
 
 {
 
 double Bid=Symbol.Bid;
 double Ask=Symbol.Ask;
 double Point=Symbol.PointSize;
 {
 
 CheckBalance();
 
 
 
 if(Trade.IsExecuting) return;
 
 if(Account.Positions.Count == 0)
 SendFirstOrder(FirstLot);
 else
 ControlSeries();
 
 foreach (var position in Account.Positions)
 {
 if(position.SymbolCode == Symbol.Code)
 {
 
 if(position.TradeType == TradeType.Buy)
 {
 if (Bid-GetAveragePrice(TradeType.Buy)>=Tral_Start*Point)
 if (Bid-Tral_Stop*Point>=position.StopLoss)
 Trade.ModifyPosition(position, Bid-Tral_Stop*Point, position.TakeProfit);
 }
 
 if(position.TradeType == TradeType.Sell)
 {
 if (GetAveragePrice(TradeType.Sell)-Ask>=Tral_Start*Point)
 if (Ask+Tral_Stop*Point<=position.StopLoss || position.StopLoss==0)
 Trade.ModifyPosition(position, Ask+Tral_Stop*Point, position.TakeProfit);
 
 }}}}}
 
 
 
 private void CheckBalance()
 
 {
 
 if (Account.Equity <= startingBalance * BalancePercent)
 
 {
 
 foreach (var pos in Account.Positions)
 
 {
 Trade.Close(pos);
 }
 Stop();
 }
 }
 
 private void SendFirstOrder(int OrderVolume)
 {
 int Signal = GetStdIlanSignal();
 if(!(Signal < 0))
 switch(Signal)
 {
 case 0:
 Trade.CreateBuyMarketOrder(Symbol, OrderVolume);
 break;
 case 1:
 Trade.CreateSellMarketOrder(Symbol, OrderVolume);
 break;
 }
 }
 
 protected override void OnPositionOpened(Position openedPosition)
 {
 double? StopLossPrice = null;
 double? TakeProfitPrice = null;
 
 if(Account.Positions.Count == 1)
 {
 position = openedPosition;
 if( position.TradeType == TradeType.Buy)
 TakeProfitPrice = position.EntryPrice + TakeProfit * Symbol.PointSize;
 if( position.TradeType == TradeType.Sell)
 TakeProfitPrice = position.EntryPrice - TakeProfit * Symbol.PointSize;
 }
 else
 switch(GetPositionsSide())
 {
 case 0:
 TakeProfitPrice = GetAveragePrice(TradeType.Buy) + TakeProfit * Symbol.PointSize;
 break;
 case 1:
 TakeProfitPrice = GetAveragePrice(TradeType.Sell) - TakeProfit * Symbol.PointSize;
 break;
 }
 
 for(int i = 0; i < Account.Positions.Count; i++)
 {
 position = Account.Positions[i];
 if(StopLossPrice != null || TakeProfitPrice != null)
 Trade.ModifyPosition(position, position.StopLoss, TakeProfitPrice);
 }
 }
 
 private double GetAveragePrice(TradeType TypeOfTrade)
 {
 double Result = Symbol.Bid;
 double AveragePrice = 0;
 long Count = 0;
 
 for(int i = 0; i < Account.Positions.Count; i++)
 {
 position = Account.Positions[i];
 if(position.TradeType == TypeOfTrade)
 {
 AveragePrice += position.EntryPrice * position.Volume;
 Count += position.Volume;
 }
 }
 if(AveragePrice > 0 && Count > 0)
 Result = AveragePrice / Count;
 return Result;
 }
 
 private int GetPositionsSide()
 {
 int Result = -1;
 int i, BuySide = 0, SellSide = 0;
 
 for(i = 0; i < Account.Positions.Count; i++)
 {
 if(Account.Positions[i].TradeType == TradeType.Buy) BuySide++;
 if(Account.Positions[i].TradeType == TradeType.Sell) SellSide++;
 }
 if(BuySide == Account.Positions.Count) Result = 0;
 if(SellSide == Account.Positions.Count) Result = 1;
 return Result;
 }
 
 private void ControlSeries()
 {
 int _pipstep, NewVolume, Rem;
 int BarCount = 25;
 int Del = MaxOrders - 1;
 
 if(PipStep == 0)
 _pipstep = GetDynamicPipstep(BarCount, Del);
 else
 _pipstep = PipStep;
 
 if(Account.Positions.Count < MaxOrders)
 switch(GetPositionsSide())
 {
 case 0:
 
 if(Symbol.Ask < FindLastPrice(TradeType.Buy) - _pipstep * Symbol.PointSize)
 {
 NewVolume = Math.DivRem((int)(FirstLot + FirstLot*Account.Positions.Count), LotStep, out Rem) * LotStep;
 if(!(NewVolume < LotStep))
 Trade.CreateBuyMarketOrder(Symbol, NewVolume);
 }
 break;
 case 1:
 
 if(Symbol.Bid > FindLastPrice(TradeType.Sell) + _pipstep * Symbol.PointSize)
 {
 NewVolume = Math.DivRem((int)(FirstLot + FirstLot*Account.Positions.Count), LotStep, out Rem) * LotStep;
 if(!(NewVolume < LotStep))
 Trade.CreateSellMarketOrder(Symbol, NewVolume);
 }
 break;
 }
 }
 
 private int GetDynamicPipstep(int CountOfBars, int Del)
 {
 int Result;
 double HighestPrice = 0, LowestPrice = 0;
 int StartBar = MarketSeries.Close.Count - 2 - CountOfBars;
 int EndBar = MarketSeries.Close.Count - 2;
 
 for(int i = StartBar; i < EndBar; i++)
 {
 if(HighestPrice == 0 && LowestPrice == 0)
 {
 HighestPrice = MarketSeries.High[i];
 LowestPrice = MarketSeries.Low[i];
 continue;
 }
 if(MarketSeries.High[i] > HighestPrice) HighestPrice = MarketSeries.High[i];
 if(MarketSeries.Low[i] < LowestPrice) LowestPrice = MarketSeries.Low[i];
 }
 Result = (int)((HighestPrice - LowestPrice) / Symbol.PointSize / Del);
 return Result;
 }
 
 private double FindLastPrice(TradeType TypeOfTrade)
 {
 double LastPrice = 0;
 
 for(int i = 0; i < Account.Positions.Count; i++)
 {
 position = Account.Positions[i];
 if(TypeOfTrade == TradeType.Buy)
 if(position.TradeType == TypeOfTrade)
 {
 if(LastPrice == 0)
 {
 LastPrice = position.EntryPrice;
 continue;
 }
 if(position.EntryPrice < LastPrice)
 LastPrice = position.EntryPrice;
 }
 if(TypeOfTrade == TradeType.Sell)
 if(position.TradeType == TypeOfTrade)
 {
 if(LastPrice == 0)
 {
 LastPrice = position.EntryPrice;
 continue;
 }
 if(position.EntryPrice > LastPrice)
 LastPrice = position.EntryPrice;
 }
 }
 return LastPrice;
 }
 
 private int GetStdIlanSignal()
 {
 int Result = -1;
 int LastBarIndex = MarketSeries.Close.Count - 2;
 int PrevBarIndex = LastBarIndex - 1;
 
 if(MarketSeries.Close[LastBarIndex] > MarketSeries.Open[LastBarIndex])
 if(MarketSeries.Close[PrevBarIndex] > MarketSeries.Open[PrevBarIndex])
 Result = 0;
 if(MarketSeries.Close[LastBarIndex] < MarketSeries.Open[LastBarIndex])
 if(MarketSeries.Close[PrevBarIndex] < MarketSeries.Open[PrevBarIndex])
 Result = 1;
 return Result;
 }
 }
 }
 
 
   | 
|                                       |  | 
 
atrader
19 Apr 2013, 11:50
Hi,
Uploaded here: /algos/robots/show/259
Read the comments, you may need more modifications.
@atrader