public override double getLevel(String symbol, TIMEFRAME timeframe, SignalResult signal) { if (signal.getSignal() < 0) { return(strategy.MarketInfo(symbol, (int)MARKET_INFO.MODE_BID) + strategy.iATR(symbol, (int)timeframe, atrPeriods, atrShift)); } else { return(strategy.MarketInfo(symbol, (int)MARKET_INFO.MODE_ASK) - strategy.iATR(symbol, (int)timeframe, atrPeriods, atrShift)); } }
public override double getEntryPrice(string symbol, SignalResult signal) { if (signal.getSignal() == SignalResult.BUYMARKET) { return(this.MarketInfo(symbol, (int)MARKET_INFO.MODE_ASK)); } else { return(this.MarketInfo(symbol, (int)MARKET_INFO.MODE_BID)); } }
public override double getLevel(String symbol, TIMEFRAME timeframe, SignalResult signal) { double range = strategy.iHigh(symbol, (int)timeframe, 1) - strategy.iLow(symbol, (int)timeframe, 1); if (signal.getSignal() == (int)SignalResult.SELLMARKET) { return(strategy.MarketInfo(symbol, (int)MARKET_INFO.MODE_BID) - pips * strategy.pipToPoint(symbol)); } else { return(strategy.MarketInfo(symbol, (int)MARKET_INFO.MODE_ASK) + pips * strategy.pipToPoint(symbol)); } }
public override void OnTick() { foreach (String symbol in symbolList) { try { int total = this.OrdersTotal(); for (int i = total - 1; i >= 0; i--) { if (OrderSelect(i, (int)SELECTION_TYPE.SELECT_BY_POS, (int)SELECTION_POOL.MODE_TRADES) && OrderMagicNumber() == getMagicNumber(symbol)) { this.manageOpenTrades(symbol, OrderTicket()); } } if (checkCandle(symbol, timeframe)) { if (this.isAsleep(symbol)) { return; } if (!this.filter(symbol)) { return; } // Check for a signal SignalResult signal = this.evaluate(symbol); if (signal.getSignal() != SignalResult.NEUTRAL) { //LOG.Info("Executing..."); this.executeTrade(symbol, signal); } } } catch (Exception ex) { LOG.Error(ex); } } }
public override double getLevel(String symbol, TIMEFRAME timeframe, SignalResult signal) { if (signal.getSignal() == SignalResult.SELLMARKET) { double current_high = strategy.iHigh(symbol, (int)timeframe, 0); for (int i = 1; strategy.iHigh(symbol, (int)timeframe, i) > current_high; i++) { current_high = strategy.iHigh(symbol, (int)timeframe, i); } return(current_high + pipTolerance * strategy.pipToPoint(symbol)); } else { double current_low = strategy.iLow(symbol, (int)timeframe, 0); for (int i = 1; strategy.iLow(symbol, (int)timeframe, i) < current_low; i++) { current_low = strategy.iLow(symbol, (int)timeframe, i); } return(current_low - pipTolerance * strategy.pipToPoint(symbol)); } }
public override SignalResult evaluate(string symbol, TIMEFRAME timeframe) { double maFast1 = strategy.iMA(symbol, (int)timeframe, maPeriodFast, maShift, (int)methodFast, (int)APPLIED_PRICE.PRICE_CLOSE, 1); double maFast2 = strategy.iMA(symbol, (int)timeframe, maPeriodFast, maShift, (int)methodFast, (int)APPLIED_PRICE.PRICE_CLOSE, 2); double maSlow1 = strategy.iMA(symbol, (int)timeframe, maPeriodSlow, maShift, (int)methodSlow, (int)APPLIED_PRICE.PRICE_CLOSE, 1); double maSlow2 = strategy.iMA(symbol, (int)timeframe, maPeriodSlow, maShift, (int)methodSlow, (int)APPLIED_PRICE.PRICE_CLOSE, 2); if (maFast1 < maSlow1 && maFast2 > maSlow2) { //strategy.LOG.Info("Signal Short: " + strategy.iTime(symbol, (int)timeframe, 0)); return(SignalResult.newSELLMARKET()); } else if (maFast1 > maSlow1 && maFast2 < maSlow2) { //strategy.LOG.Info("Signal Long: " + strategy.iTime(symbol, (int)timeframe, 0)); return(SignalResult.newBUYMARKET()); } else { //strategy.LOG.Info("Signal Neutral: " + strategy.iTime(symbol, (int)timeframe, 0)); return(SignalResult.newNEUTRAL()); } }
// Non Abstract methods public double getStopEntry(String symbol, SignalResult signal) { return(0); }
public override double getLevel(String symbol, TIMEFRAME timeframe, SignalResult signal) { return(0); }
public override DateTime getExpiry(string symbol, SignalResult signal) { return(DateUtil.FromUnixTime(0)); //epoch }
public override DateTime getExpiry(string symbol, SignalResult signal) { throw new NotImplementedException(); }
public override double getStopLoss(string symbol, SignalResult signal) { return(srStopLoss.getLevel(symbol, strategyTimeframe, signal)); }
public override double getTakeProfit(string symbol, SignalResult signal) { throw new NotImplementedException(); }
public override double getEntryPrice(string symbol, SignalResult signal) { throw new NotImplementedException(); }
// Method to execute the trade public void executeTrade(String symbol, SignalResult signal) { try { TRADE_OPERATION op; double lots; int slippage = 5000; double stoploss = this.getStopLoss(symbol, signal); double takeprofit = this.getTakeProfit(symbol, signal); String comment = this.getComment(symbol); int magic = this.getMagicNumber(symbol); DateTime expiration = this.getExpiry(symbol, signal); COLOR arrowColor = COLOR.Aqua; double stopDistance; DateTime lastBuyOpen, lastSellOpen; bool openBuyOrder = false, openSellOrder = false, openBuyStopOrder = false, openSellStopOrder = false, openBuyLimitOrder = false, openSellLimitOrder = false; if (signal.getSignal() == SignalResult.BUYMARKET) { op = TRADE_OPERATION.OP_BUY; } else if (signal.getSignal() == SignalResult.SELLMARKET) { op = TRADE_OPERATION.OP_SELL; } else if (signal.getSignal() == SignalResult.BUYSTOP) { op = TRADE_OPERATION.OP_BUYSTOP; } else if (signal.getSignal() == SignalResult.SELLSTOP) { op = TRADE_OPERATION.OP_SELLSTOP; } else if (signal.getSignal() == SignalResult.BUYLIMIT) { op = TRADE_OPERATION.OP_BUYLIMIT; } else if (signal.getSignal() == SignalResult.SELLLIMIT) { op = TRADE_OPERATION.OP_SELLLIMIT; } else { throw new Exception("Invalid Signal signal=" + signal); } //LOG.Debug("stopDistance: " + stopDistance); //LOG.Debug("price: " + price); //LOG.Debug("stoploss: " + stoploss); //LOG.Debug("takeprofit: " + takeprofit); // Check open trades on this symbol for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, (int)SELECTION_TYPE.SELECT_BY_POS, (int)SELECTION_POOL.MODE_TRADES)) { if (OrderType() == (int)TRADE_OPERATION.OP_BUY && OrderSymbol().Equals(symbol) && OrderMagicNumber() == magic) { lastBuyOpen = OrderOpenTime(); openBuyOrder = true; if (closeOnOpposingSignal && signal.getSignal() < 0) { closeOutThisOrder(symbol); } } else if (OrderType() == (int)TRADE_OPERATION.OP_SELL && OrderSymbol().Equals(symbol) && OrderMagicNumber() == magic) { lastSellOpen = OrderOpenTime(); openSellOrder = true; if (closeOnOpposingSignal && signal.getSignal() > 0) { closeOutThisOrder(symbol); } } else if (OrderType() == (int)TRADE_OPERATION.OP_BUYSTOP && OrderSymbol().Equals(symbol) && OrderMagicNumber() == magic) { openBuyStopOrder = true; } else if (OrderType() == (int)TRADE_OPERATION.OP_SELLSTOP && OrderSymbol().Equals(symbol) && OrderMagicNumber() == magic) { openSellStopOrder = true; } else if (OrderType() == (int)TRADE_OPERATION.OP_BUYLIMIT && OrderSymbol().Equals(symbol) && OrderMagicNumber() == magic) { openBuyLimitOrder = true; } else if (OrderType() == (int)TRADE_OPERATION.OP_SELLLIMIT && OrderSymbol().Equals(symbol) && OrderMagicNumber() == magic) { openSellLimitOrder = true; } } } // Calculate lots double entryPrice = this.getEntryPrice(symbol, signal); if (signal.getSignal() > 0) { stopDistance = entryPrice - stoploss; } else { stopDistance = stoploss - entryPrice; } lots = this.getLotSize(symbol, stopDistance); if ((signal.getSignal() == SignalResult.BUYMARKET && !openBuyOrder) || (signal.getSignal() == SignalResult.SELLMARKET && !openSellOrder) || (signal.getSignal() == SignalResult.BUYLIMIT && !openBuyLimitOrder && !openBuyOrder) || (signal.getSignal() == SignalResult.SELLLIMIT && !openSellLimitOrder && !openSellOrder) || (signal.getSignal() == SignalResult.BUYSTOP && !openBuyStopOrder && !openBuyOrder) || (signal.getSignal() == SignalResult.SELLSTOP && !openSellStopOrder && !openSellOrder)) { string tradeoperation = string.Empty; switch (op) { case TRADE_OPERATION.OP_BUY: tradeoperation = "BUY"; break; case TRADE_OPERATION.OP_SELL: tradeoperation = "SELL"; break; case TRADE_OPERATION.OP_BUYLIMIT: tradeoperation = "BUYLIMIT"; break; case TRADE_OPERATION.OP_SELLLIMIT: tradeoperation = "SELLLIMIT"; break; case TRADE_OPERATION.OP_BUYSTOP: tradeoperation = "BUYSTOP"; break; case TRADE_OPERATION.OP_SELLSTOP: tradeoperation = "SELLSTOP"; break; } LOG.Info(String.Format("Executing Trade at " + DateUtil.FromUnixTime((long)MarketInfo(symbol, (int)MARKET_INFO.MODE_TIME)) + "\n\tsymbol:\t{0}" + "\n\top:\t\t{1}" + "\n\tlots:\t\t{2}" + "\n\tentryPrice:\t{3}" + "\n\tslippage:\t{4}" + "\n\tstoploss:\t{5}" + "\n\ttakeprofit:\t{6}" + "\n\tcomment:\t{7}" + "\n\tmagic:\t\t{8}" + "\n\texpiration:\t{9}" + "\n\tarrowColor:\t{0}", symbol, tradeoperation, lots, entryPrice, slippage, stoploss, takeprofit, comment, magic, expiration, arrowColor)); OrderSend(symbol, (int)op, lots, entryPrice, slippage, stoploss, takeprofit, comment, magic, expiration, arrowColor); } } catch (Exception e) { LOG.Error(e); throw; } }
public override double getStopLoss(string symbol, SignalResult signal) { throw new NotImplementedException(); }
public override double getTakeProfit(string symbol, SignalResult signal) { return(fixedPipTakeProfit.getLevel(symbol, strategyTimeframe, signal)); }
public abstract DateTime getExpiry(String symbol, SignalResult signal);
public abstract double getEntryPrice(String symbol, SignalResult signal);
public abstract double getTakeProfit(String symbol, SignalResult signal);
public abstract double getStopLoss(String symbol, SignalResult signal);