Conversione per Pro Real Tine
Forums › ProRealTime forum Italiano › Supporto ProOrder › Conversione per Pro Real Tine
- This topic has 1 reply, 1 voice, and was last updated 2 years ago by mikrobo.
-
-
10/03/2022 at 9:12 AM #201816
Ciao a tutti,
qualcuno potrebbe convertire il seguente codice per PRT?
study(“ROBERTONE”, overlay=false)
pd = input(23, title=”LookBack Period Standard Deviation High”)
bbl = input(20, title=”Bolinger Band Length”)
mult = input(2.0 , minval=1, maxval=5, title=”Bollinger Band Standard Devaition Up”)
lb = input(50 , title=”Look Back Period Percentile High”)
ph = input(.85, title=”Highest Percentile – 0.90=90%, 0.95=95%, 0.99=99%”)
pl = input(1.01, title=”Lowest Percentile – 1.10=90%, 1.05=95%, 1.01=99%”)
hp = input(false, title=”Show High Range – Based on Percentile and LookBack Period?”)
sd = input(false, title=”Show Standard Deviation Line?”)wvf = ((highest(close, pd)-low)/(highest(close, pd)))*100
sDev = mult * stdev(wvf, bbl)
midLine = sma(wvf, bbl)
lowerBand = midLine – sDev
upperBand = midLine + sDevrangeHigh = (highest(wvf, lb)) * ph
rangeLow = (lowest(wvf, lb)) * plcol = wvf >= upperBand or wvf >= rangeHigh ? lime : gray
plot(hp and rangeHigh ? rangeHigh : na, title=”Range High Percentile”, style=line, linewidth=4, color=orange)
plot(hp and rangeLow ? rangeLow : na, title=”Range High Percentile”, style=line, linewidth=4, color=orange)
plot(wvf, title=”ROBERTONE”, style=histogram, linewidth = 4, color=col)
plot(sd and upperBand ? upperBand : na, title=”Upper Band”, style=line, linewidth = 3, color=aqua)10/04/2022 at 9:50 AM #201892scusate era incompleto
using System;
using cAlgo.API;namespace cAlgo
{
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class AAA : Robot
{
private bool _accountIsOutOfMoney;
private int _openTradeResult;private readonly string Label = “RobyONE”;
private DateTime _lastBuyTradeTime;
private DateTime _lastSellTradeTime;[Parameter(“Buy”, DefaultValue = true)]
public bool Buy { get; set; }[Parameter(“Sell”, DefaultValue = true)]
public bool Sell { get; set; }[Parameter(“Pip Step”, DefaultValue = 10, MinValue = 0.1)]
public int PipStep { get; set; }[Parameter(“First Volume (Lots)”, DefaultValue = 1, MinValue = 0.01, Step = 0.01)]
public double FirstVolume { get; set; }[Parameter(“Volume Exponent”, DefaultValue = 1.0, MinValue = 0.1, MaxValue = 5.0)]
public double VolumeExponent { get; set; }[Parameter(“Max Spread”, DefaultValue = 3.0)]
public double MaxSpread { get; set; }[Parameter(“Average TP”, DefaultValue = 3, MinValue = 1)]
public int AverageTakeProfit { get; set; }private double CurrentSpread
{
get { return (Symbol.Ask – Symbol.Bid) / Symbol.PipSize; }
}protected override void OnStart()
{
}protected override void OnTick()
{
if (CountOfTradesOfType(TradeType.Buy) > 0)
AdjustBuyPositionTakeProfits(CalculateAveragePositionPrice(TradeType.Buy), AverageTakeProfit);
if (CountOfTradesOfType(TradeType.Sell) > 0)
AdjustSellPositionTakeProfits(CalculateAveragePositionPrice(TradeType.Sell), AverageTakeProfit);
if (CurrentSpread <= MaxSpread && !_accountIsOutOfMoney)
ProcessTrades();if (!this.IsBacktesting)
DisplayStatusOnChart();
}protected override void OnError(Error error)
{
if (error.Code == ErrorCode.NoMoney)
{
_accountIsOutOfMoney = true;
Print(“opening stopped because: not enough money”);
}
}protected override void OnBar()
{
RefreshData();
}protected override void OnStop()
{
// ChartObjects.RemoveAllObjects();
Chart.RemoveAllObjects();
}private void ProcessTrades()
{if (Buy && CountOfTradesOfType(TradeType.Buy) == 0 && MarketSeries.Close.Last(1) > MarketSeries.Close.Last(2))
{
_openTradeResult = OrderSend(TradeType.Buy, LimitVolume(FirstVolume));
if (_openTradeResult > 0)
_lastBuyTradeTime = MarketSeries.OpenTime.Last(0);
else
Print(“First BUY openning error at: “, Symbol.Ask, “Error Type: “, LastResult.Error);
}
if (Sell && CountOfTradesOfType(TradeType.Sell) == 0 && MarketSeries.Close.Last(2) > MarketSeries.Close.Last(1))
{
_openTradeResult = OrderSend(TradeType.Sell, LimitVolume(FirstVolume));
if (_openTradeResult > 0)
_lastSellTradeTime = MarketSeries.OpenTime.Last(0);
else
Print(“First SELL opening error at: “, Symbol.Bid, “Error Type: “, LastResult.Error);
}if (CountOfTradesOfType(TradeType.Buy) > 0)
{
if (Math.Round(Symbol.Ask, Symbol.Digits) < Math.Round(FindLowestPositionPrice(TradeType.Buy) – PipStep * Symbol.PipSize, Symbol.Digits) && _lastBuyTradeTime != MarketSeries.OpenTime.Last(0))
{
var calculatedVolume = CalculateVolume(TradeType.Buy);
_openTradeResult = OrderSend(TradeType.Buy, LimitVolume(calculatedVolume));
if (_openTradeResult > 0)
_lastBuyTradeTime = MarketSeries.OpenTime.Last(0);
else
Print(“Next BUY opening error at: “, Symbol.Ask, “Error Type: “, LastResult.Error);
}
}
if (CountOfTradesOfType(TradeType.Sell) > 0)
{
if (Math.Round(Symbol.Bid, Symbol.Digits) > Math.Round(FindHighestPositionPrice(TradeType.Sell) + PipStep * Symbol.PipSize, Symbol.Digits) && _lastSellTradeTime != MarketSeries.OpenTime.Last(0))
{
var calculatedVolume = CalculateVolume(TradeType.Sell);
_openTradeResult = OrderSend(TradeType.Sell, LimitVolume(calculatedVolume));
if (_openTradeResult > 0)
_lastSellTradeTime = MarketSeries.OpenTime.Last(0);
else
Print(“Next SELL opening error at: “, Symbol.Bid, “Error Type: “, LastResult.Error);
}
}
}private int OrderSend(TradeType tradeType, double volumeToUse)
{
var returnResult = 0;
if (volumeToUse > 0)
{
var result = ExecuteMarketOrder(tradeType, Symbol, volumeToUse, Label, 0, 0, 0, “RobertONE”);if (result.IsSuccessful)
{
Print(tradeType, “Opened at: “, result.Position.EntryPrice);
returnResult = 1;
}
else
Print(tradeType, “Openning Error: “, result.Error);
}
else
Print(“Volume calculation error: Calculated Volume is: “, volumeToUse);
return returnResult;
}private void AdjustBuyPositionTakeProfits(double averageBuyPositionPrice, int averageTakeProfit)
{
foreach (var buyPosition in Positions)
{
if (buyPosition.Label == Label && buyPosition.SymbolCode == Symbol.Code)
{
if (buyPosition.TradeType == TradeType.Buy)
{
double? calculatedTakeProfit = Math.Round(averageBuyPositionPrice + averageTakeProfit * Symbol.PipSize, Symbol.Digits);
if (buyPosition.TakeProfit != calculatedTakeProfit)
ModifyPosition(buyPosition, buyPosition.StopLoss, calculatedTakeProfit);
}
}
}
}private void AdjustSellPositionTakeProfits(double averageSellPositionPrice, int averageTakeProfit)
{
foreach (var sellPosition in Positions)
{
if (sellPosition.Label == Label && sellPosition.SymbolCode == Symbol.Code)
{
if (sellPosition.TradeType == TradeType.Sell)
{
double? calculatedTakeProfit = Math.Round(averageSellPositionPrice – averageTakeProfit * Symbol.PipSize, Symbol.Digits);
if (sellPosition.TakeProfit != calculatedTakeProfit)
ModifyPosition(sellPosition, sellPosition.StopLoss, calculatedTakeProfit);
}
}
}
}private void DisplayStatusOnChart()
{
if (CountOfTradesOfType(TradeType.Buy) > 1)
{
var y = CalculateAveragePositionPrice(TradeType.Buy);
// ChartObjects.DrawHorizontalLine(“bpoint”, y, Colors.Yellow, 2, LineStyle.Dots);
Chart.DrawHorizontalLine(“bpoint”, y, Color.Yellow, 2, LineStyle.Dots);
}
else
//ChartObjects.RemoveObject(“bpoint”);
Chart.RemoveObject(“bpoint”);
if (CountOfTradesOfType(TradeType.Sell) > 1)
{
var z = CalculateAveragePositionPrice(TradeType.Sell);
//ChartObjects.DrawHorizontalLine(“spoint”, z, Colors.HotPink, 2, LineStyle.Dots);
Chart.DrawHorizontalLine(“spoint”, z, Color.HotPink, 2, LineStyle.Dots);
}
else
//ChartObjects.RemoveObject(“spoint”);
Chart.RemoveObject(“spoint”);
//ChartObjects.DrawText(“pan”, GenerateStatusText(), StaticPosition.TopLeft, Colors.Tomato);
Chart.DrawStaticText(“pan”, GenerateStatusText(), VerticalAlignment.Top, HorizontalAlignment.Left, Color.Tomato);
}private string GenerateStatusText()
{
var statusText = “”;
var buyPositions = “”;
var sellPositions = “”;
var spread = “”;
var buyDistance = “”;
var sellDistance = “”;
spread = “\nSpread = ” + Math.Round(CurrentSpread, 1);
buyPositions = “\nBuy Positions = ” + CountOfTradesOfType(TradeType.Buy);
sellPositions = “\nSell Positions = ” + CountOfTradesOfType(TradeType.Sell);
if (CountOfTradesOfType(TradeType.Buy) > 0)
{
var averageBuyFromCurrent = Math.Round((CalculateAveragePositionPrice(TradeType.Buy) – Symbol.Bid) / Symbol.PipSize, 1);
buyDistance = “\nBuy Target Away = ” + averageBuyFromCurrent;
}
if (CountOfTradesOfType(TradeType.Sell) > 0)
{
var averageSellFromCurrent = Math.Round((Symbol.Ask – CalculateAveragePositionPrice(TradeType.Sell)) / Symbol.PipSize, 1);
sellDistance = “\nSell Target Away = ” + averageSellFromCurrent;
}
if (CurrentSpread > MaxSpread)
statusText = “MAX SPREAD EXCEED”;
else
statusText = “ROBERTONE” + buyPositions + spread + sellPositions + buyDistance + sellDistance;
return (statusText);
}private int CountOfTradesOfType(TradeType tradeType)
{
var tradeCount = 0;foreach (var position in Positions)
{
if (position.Label == Label && position.SymbolCode == Symbol.Code)
{
if (position.TradeType == tradeType)
tradeCount++;
}
}return tradeCount;
}private double CalculateAveragePositionPrice(TradeType tradeType)
{
double result = 0;
double averagePrice = 0;
double count = 0;foreach (var position in Positions)
{
if (position.Label == Label && position.SymbolCode == Symbol.Code)
{
if (position.TradeType == tradeType)
{
averagePrice += position.EntryPrice * position.VolumeInUnits;
count += position.VolumeInUnits;
}
}}
if (averagePrice > 0 && count > 0)
result = Math.Round(averagePrice / count, Symbol.Digits);
return result;
}private double FindLowestPositionPrice(TradeType tradeType)
{
double lowestPrice = 0;foreach (var position in Positions)
{
if (position.Label == Label && position.SymbolCode == Symbol.Code)
{
if (position.TradeType == tradeType)
{
if (lowestPrice == 0)
{
lowestPrice = position.EntryPrice;
continue;
}
if (position.EntryPrice < lowestPrice)
lowestPrice = position.EntryPrice;
}
}
}return lowestPrice;
}private double FindHighestPositionPrice(TradeType tradeType)
{
double highestPrice = 0;foreach (var position in Positions)
{
if (position.Label == Label && position.SymbolCode == Symbol.Code)
{
if (position.TradeType == tradeType)
{
if (highestPrice == 0)
{
highestPrice = position.EntryPrice;
continue;
}
if (position.EntryPrice > highestPrice)
highestPrice = position.EntryPrice;
}
}
}return highestPrice;
}private double FindPriceOfMostRecentPositionId(TradeType tradeType)
{
double price = 0;
var highestPositionId = 0;foreach (var position in Positions)
{
if (position.Label == Label && position.SymbolCode == Symbol.Code)
{
if (position.TradeType == tradeType)
{
if (highestPositionId == 0 || highestPositionId > position.Id)
{
price = position.EntryPrice;
highestPositionId = position.Id;
}
}
}
}return price;
}private double GetMostRecentPositionVolume(TradeType tradeType)
{
double mostRecentVolume = 0;
var highestPositionId = 0;foreach (var position in Positions)
{
if (position.Label == Label && position.SymbolCode == Symbol.Code)
{
if (position.TradeType == tradeType)
{
if (highestPositionId == 0 || highestPositionId > position.Id)
{
mostRecentVolume = position.VolumeInUnits;
highestPositionId = position.Id;
}
}
}
}return mostRecentVolume;
}private int CountNumberOfPositionsOfType(TradeType tradeType)
{
var mostRecentPrice = FindPriceOfMostRecentPositionId(tradeType);
var numberOfPositionsOfType = 0;foreach (var position in Positions)
{
if (position.Label == Label && position.SymbolCode == Symbol.Code)
{
if (position.TradeType == tradeType && tradeType == TradeType.Buy)
{
if (Math.Round(position.EntryPrice, Symbol.Digits) <= Math.Round(mostRecentPrice, Symbol.Digits))
numberOfPositionsOfType++;
}
if (position.TradeType == tradeType && tradeType == TradeType.Sell)
{
if (Math.Round(position.EntryPrice, Symbol.Digits) >= Math.Round(mostRecentPrice, Symbol.Digits))
numberOfPositionsOfType++;
}
}
}return (numberOfPositionsOfType);
}private double CalculateVolume(TradeType tradeType)
{
var numberOfPositions = CountNumberOfPositionsOfType(tradeType);
var mostRecentVolume = GetMostRecentPositionVolume(tradeType);
var calculatedVolume = Symbol.NormalizeVolumeInUnits(mostRecentVolume * Math.Pow(VolumeExponent, numberOfPositions));
return (calculatedVolume);
}private double LimitVolume(double volumeIn)
{
var symbolVolumeMin = Symbol.VolumeInUnitsMin;
var symbolVolumeMax = Symbol.VolumeInUnitsMax;
var result = volumeIn;
if (result < symbolVolumeMin)
result = symbolVolumeMin;
if (result > symbolVolumeMax)
result = symbolVolumeMax;
return (result);
}
}
} -
AuthorPosts
Find exclusive trading pro-tools on