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