130 lines
3.6 KiB
Plaintext
130 lines
3.6 KiB
Plaintext
|
|
//
|
|
// Support Signals ...
|
|
void GenerateSupportSignals(
|
|
XSignal &result[], // Hold Result ...
|
|
const XSignal &source // Source Signal to Use for Generation ...
|
|
)
|
|
{
|
|
//
|
|
// Here we must Prepare all Signals ...
|
|
|
|
//
|
|
Clean(result);
|
|
|
|
//
|
|
if (source.entry <= 0 ||
|
|
(ArraySize(source.supportAndResistance.sup) == 0 &&
|
|
ArraySize(source.supportAndResistance.res) == 0))
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
double priceOf10Points = PointToPrice(
|
|
source.symbol,
|
|
10);
|
|
|
|
//
|
|
double tmpSupRes[];
|
|
int supResCount = ArraySize(source.supportAndResistance.sup) +
|
|
ArraySize(source.supportAndResistance.res);
|
|
ArrayResize(
|
|
tmpSupRes,
|
|
supResCount);
|
|
ArrayCopy(
|
|
tmpSupRes,
|
|
source.supportAndResistance.sup);
|
|
ArrayCopy(
|
|
tmpSupRes,
|
|
source.supportAndResistance.res,
|
|
0,
|
|
ArraySize(source.supportAndResistance.sup) - 1);
|
|
|
|
//
|
|
bool isLong = IsLong(source.type);
|
|
|
|
//
|
|
ENUM_POSITION_TYPE signalReverseType = isLong
|
|
? POSITION_TYPE_SELL
|
|
: POSITION_TYPE_BUY;
|
|
|
|
//
|
|
// Template Variables ...
|
|
double sl;
|
|
double tp;
|
|
double entry;
|
|
ENUM_POSITION_TYPE type;
|
|
ENUM_X_ORDER_MODES mode;
|
|
double r2r = 1.5;
|
|
double volume = NormalizeVolume(
|
|
source.volume, // * 1.5,
|
|
source.symbol);
|
|
string symbol = source.symbol;
|
|
ENUM_TIMEFRAMES period = source.period;
|
|
double riskAmount = source.riskAmount; // * 1.5;
|
|
|
|
//
|
|
XSignal tmpSignal;
|
|
Clean(tmpSignal);
|
|
|
|
//
|
|
// since SL is Lower Sup or Higher Res ...
|
|
// we have to add a Reversal Support for SL ...
|
|
if (source.sl > 0)
|
|
{
|
|
//
|
|
// Sl Type Signals are Reversal ...
|
|
type = signalReverseType;
|
|
|
|
//
|
|
// Finding Entry Price ...
|
|
entry = source.sl - priceOf10Points;
|
|
sl = !isLong
|
|
? FindLesserThanValue(entry, tmpSupRes)
|
|
: FindBiggerThanValue(entry, tmpSupRes);
|
|
double riskPrice = sl > 0
|
|
? MathAbs(entry - sl)
|
|
: MathAbs(entry - priceOf10Points);
|
|
double riskPoint = PriceToPoint(
|
|
symbol,
|
|
riskPrice);
|
|
double rewardPoint = r2r * riskPoint;
|
|
double rewardPrice = PointToPrice(
|
|
symbol,
|
|
rewardPoint);
|
|
tp = !isLong
|
|
? entry + rewardPrice
|
|
: entry - rewardPrice;
|
|
|
|
//
|
|
mode = X_ORDER_MODE_STOP;
|
|
|
|
//
|
|
// Fill ...
|
|
tmpSignal.sl = sl;
|
|
tmpSignal.tp = tp;
|
|
tmpSignal.r2r = r2r;
|
|
tmpSignal.type = type;
|
|
tmpSignal.mode = mode;
|
|
tmpSignal.entry = entry;
|
|
tmpSignal.symbol = symbol;
|
|
tmpSignal.volume = volume;
|
|
tmpSignal.period = period;
|
|
tmpSignal.riskAmount = riskAmount;
|
|
|
|
//
|
|
Add(
|
|
tmpSignal,
|
|
result);
|
|
Clean(tmpSignal);
|
|
}
|
|
|
|
//
|
|
// add MidTerm Support Signal ...
|
|
// TODO:
|
|
|
|
//
|
|
// TODO: Implement another Support Scenarios ...
|
|
}
|