ifdistance>=api.StepPips:# self.open_position()ifself.passes_rsi_filter():self.open_position()else:api.Print("RSI filter: no new entry (RSI={:.2f}, range {}-{})".format(self.get_rsi_value(),self.rsi_oversold,self.rsi_overbought))defget_rsi_value(self):# Use the last CLOSED bar for stabilityreturnself.rsi.Result.Last(1)defpasses_rsi_filter(self):r=self.get_rsi_value()return(r>self.rsi_oversold)and(r<self.rsi_overbought)
importclrclr.AddReference("cAlgo.API")# Import cAlgo API typesfromcAlgo.APIimport*# Import trading wrapper functionsfromrobot_wrapperimport*classSupercBot():defon_start(self):self.volumeInUnits=api.Symbol.QuantityToVolumeInUnits(api.VolumeInLots)self.enoughMoney=Trueself.rsi_period=getattr(api,"RsiPeriod",14)self.rsi_overbought=getattr(api,"RsiOverbought",70)self.rsi_oversold=getattr(api,"RsiOversold",30)self.rsi=api.Indicators.RelativeStrengthIndex(api.Bars.ClosePrices,self.rsi_period)iflen(self.get_grid_positions())==0:ifself.passes_rsi_filter():self.open_position()else:api.Print("RSI filter blocked initial entry (RSI={:.2f})".format(self.get_rsi_value()))defon_tick(self):grid_positions=self.get_grid_positions()net_profit_sum=sum([p.NetProfitforpingrid_positions])ifnet_profit_sum>=api.TargetProfit:api.Print("Target profit is reached. Closing all grid positions")self.close_grid_positions()api.Print("All grid positions are closed. Stopping cBot")api.Stop()iflen(grid_positions)>0andself.enoughMoney==True:position_with_highest_pips=sorted(grid_positions,key=lambdapos:pos.Pips,reverse=True)[0]distance=self.get_distance_in_pips(position_with_highest_pips)ifdistance>=api.StepPips:ifself.passes_rsi_filter():self.open_position()else:api.Print("RSI filter: no new entry (RSI={:.2f}, range {}-{})".format(self.get_rsi_value(),self.rsi_oversold,self.rsi_overbought))defget_rsi_value(self):# Use the last CLOSED bar for stabilityreturnself.rsi.Result.Last(1)defpasses_rsi_filter(self):r=self.get_rsi_value()return(r>self.rsi_oversold)and(r<self.rsi_overbought)defget_grid_positions(self):return[posforposinapi.Positionsifpos.SymbolName==api.SymbolNameandpos.TradeType==api.TradeType]defopen_position(self):result=api.ExecuteMarketOrder(api.TradeType,api.SymbolName,self.volumeInUnits,"Grid")ifresult.Error==ErrorCode.NoMoney:self.enoughMoney=Falseapi.Print("Not enough money to open additional positions")defclose_grid_positions(self):forpositioninself.get_grid_positions():position.Close()iflen(self.get_grid_positions())>0:self.close_grid_positions()defget_distance_in_pips(self,position):ifposition.TradeType==TradeType.Buy:diff=position.EntryPrice-api.Symbol.Askelse:diff=api.Symbol.Bid-position.EntryPricereturndiff/api.Symbol.PipSize