concept G22PassiveTradingStrategy extends G22TradingStrategy { // A regular expression that will be used to match // the "strategy" field coming from TradingView to // distinguish this strategy from others on the same coin. settableWithVar S tradingViewRegexp; // If not 0, ths "PS" comment (position size) coming from // TradingView is evaluated. // tradingViewPSFactor == 100 => scale $100 in TradingView to our current equity // tradingViewPSFactor == 50 => scale $100 in TradingView to 50% of our current equity settableWithVar double tradingViewPSFactor; // Stop loss percentage assumed for riskPerTrade calculation (0 if not set) settableWithVar double assumedStopLoss; // If not 0, this is the assumed standard quantity of each // trade in the TradingView strategy. Then pyramiding will be // done using this value. settableWithVar double tradingViewStandardQty; // If not 0, positions will be opened proportional to those // in the TradingView strategy using this factor. // This overrides the other methods of determining position size. settableWithVar double tradingViewScalingFactor; settable bool remoteOpenable = true; settable bool remoteCloseable = true; void price(double price) { if (currentPrice == price) ret; currentPrice = price; afterStep(); change(); } bool tradingViewMatch(S text) { ret empty(cleanedTradingViewRegexp()) || safeRegexpFindIC(cleanedTradingViewRegexp(), text); } S cleanedTradingViewRegexp() { ret trim(tradingViewRegexp); } LS addPassiveTradingStatus(LS list) { if (nempty(tradingViewRegexp)) list.add("TradingView regexp: " + cleanedTradingViewRegexp()); ret list; } LS status() { ret addPassiveTradingStatus(super.status()); } LS activationStatus() { ret addPassiveTradingStatus(super.activationStatus()); } bool hasTradingViewPSFactor() { ret isNonZero(tradingViewPSFactor); } }