Delete Shark.mq5
This commit is contained in:
@@ -1,846 +0,0 @@
|
|||||||
//+------------------------------------------------------------------+
|
|
||||||
//| ZoneScanner.mq5 |
|
|
||||||
//| Copyright 2023, MetaQuotes Ltd. |
|
|
||||||
//| https://www.mql5.com |
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
#property copyright "Copyright 2023, MetaQuotes Ltd."
|
|
||||||
#property link "https://www.mql5.com"
|
|
||||||
#property version "1.00"
|
|
||||||
|
|
||||||
|
|
||||||
// INPUT VARIABLES
|
|
||||||
input ENUM_TIMEFRAMES inputTimeFrameFractals ;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// FRACTAL VARIABLES INITIALIZATION
|
|
||||||
|
|
||||||
input int leftPeriod;
|
|
||||||
input int rightPeriod;
|
|
||||||
input int weekPeriodToInitialize;
|
|
||||||
input int initFractalsPeriod ;
|
|
||||||
int lowFractalIndex ;
|
|
||||||
int highFractalIndex ;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// GUI CLASSES INCLUDES
|
|
||||||
#include "ZoneContainer.mqh"
|
|
||||||
#include "GraphicalObjectsManager.mqh"
|
|
||||||
#include "ObjectConfirmationUnit.mqh"
|
|
||||||
#include "TempObjectAttributes.mqh"
|
|
||||||
|
|
||||||
|
|
||||||
// DATA STRUCTURE CLASSES INCLUDES
|
|
||||||
#include "Zone.mqh"
|
|
||||||
#include "LowFractal.mqh"
|
|
||||||
#include "HighFractal.mqh"
|
|
||||||
#include "LowFractalContainer.mqh"
|
|
||||||
#include "HighFractalContainer.mqh"
|
|
||||||
|
|
||||||
|
|
||||||
// ALGORITHM CLASSES INCLUDES
|
|
||||||
|
|
||||||
#include "NewCandleDetector.mqh"
|
|
||||||
|
|
||||||
// LIBRARIES INCLUDES
|
|
||||||
#include <library_functions.mqh>
|
|
||||||
|
|
||||||
|
|
||||||
// GUI CLASSES INITIALIZATION
|
|
||||||
GraphicalObjectsManager* objectsManager = new GraphicalObjectsManager();
|
|
||||||
ObjectConfirmationUnit* objectConfUnit = new ObjectConfirmationUnit();
|
|
||||||
TempObjectAttributes* tempObjectAttr = new TempObjectAttributes();
|
|
||||||
|
|
||||||
|
|
||||||
// CONTAINERS INITIALIZATION
|
|
||||||
ZoneContainer zoneContainer ;
|
|
||||||
LowFractalContainer* lowsContainer = new LowFractalContainer(inputTimeFrameFractals) ;
|
|
||||||
|
|
||||||
HighFractalContainer* highsContainer = new HighFractalContainer(inputTimeFrameFractals) ;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// GENERAL CHART VARIABLES INITIALIZATION
|
|
||||||
bool initialized = false ;
|
|
||||||
bool firstCandleAfterStart = true ;
|
|
||||||
|
|
||||||
|
|
||||||
// NEW CANDLE CLASSES INITIALIZATION
|
|
||||||
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
//| |
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
|
|
||||||
/*NewCandleDetector* newCandleDetectorM1 = new NewCandleDetector("PERIOD_M1");
|
|
||||||
NewCandleDetector* newCandleDetectorM5 = new NewCandleDetector("PERIOD_M5");
|
|
||||||
NewCandleDetector* newCandleDetectorM15 = new NewCandleDetector("PERIOD_M15");
|
|
||||||
NewCandleDetector* newCandleDetectorM30 = new NewCandleDetector("PERIOD_M30");
|
|
||||||
NewCandleDetector* newCandleDetectorH1 = new NewCandleDetector("PERIOD_H1");
|
|
||||||
NewCandleDetector* newCandleDetectorH4 = new NewCandleDetector("PERIOD_H4");
|
|
||||||
NewCandleDetector* newCandleDetectorD1 = new NewCandleDetector("PERIOD_D1"); */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// LIVE FORMING FRACTALS HANDLER CLASS
|
|
||||||
NewCandleDetector* newCandleDetectorLive ;
|
|
||||||
|
|
||||||
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
//| Expert initialization function |
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
int OnInit()
|
|
||||||
{
|
|
||||||
//--- create timer
|
|
||||||
EventSetTimer(60);
|
|
||||||
//Print("the ask is: " + SymbolInfoDouble(_Symbol, SYMBOL_ASK));
|
|
||||||
|
|
||||||
// THIS IS FOR SETTING THE NEW CANDLE DETECTOR TIMEFRAME FOR THE LIVE FRACTALS . (IN ORDER TO KNOW WHICH TIMEFRAME OF THE LIVE FRACTALS TO TAKE)
|
|
||||||
|
|
||||||
if(inputTimeFrameFractals == PERIOD_M1)
|
|
||||||
{
|
|
||||||
|
|
||||||
newCandleDetectorLive = new NewCandleDetector("PERIOD_M1");
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if(inputTimeFrameFractals == PERIOD_M5)
|
|
||||||
{
|
|
||||||
|
|
||||||
newCandleDetectorLive = new NewCandleDetector("PERIOD_M5");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if(inputTimeFrameFractals == PERIOD_M15)
|
|
||||||
{
|
|
||||||
newCandleDetectorLive = new NewCandleDetector("PERIOD_M15");
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if(inputTimeFrameFractals == PERIOD_M30)
|
|
||||||
{
|
|
||||||
|
|
||||||
newCandleDetectorLive = new NewCandleDetector("PERIOD_M30");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if(inputTimeFrameFractals == PERIOD_H1)
|
|
||||||
{
|
|
||||||
newCandleDetectorLive = new NewCandleDetector("PERIOD_H1");
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if(inputTimeFrameFractals == PERIOD_H4)
|
|
||||||
{
|
|
||||||
newCandleDetectorLive = new NewCandleDetector("PERIOD_H4");
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if(inputTimeFrameFractals == PERIOD_D1)
|
|
||||||
{
|
|
||||||
newCandleDetectorLive = new NewCandleDetector("PERIOD_D1");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if(initialized == false)
|
|
||||||
{
|
|
||||||
Print("Shark Initialized successfully on " + Symbol());
|
|
||||||
|
|
||||||
// ADD THE BUTTONS TO THE SCREEN
|
|
||||||
objectsManager.addZoneButton();
|
|
||||||
objectsManager.addConfirmButton();
|
|
||||||
objectsManager.addDeleteButton();
|
|
||||||
objectsManager.addExitExperAdvisorButton();
|
|
||||||
objectsManager.addPrintFractalsButton();
|
|
||||||
objectsManager.addPrintZonesButton();
|
|
||||||
|
|
||||||
// INIT FRACTAL VARIABLES
|
|
||||||
lowFractalIndex = rightPeriod+1 ; // this is used for the fractals
|
|
||||||
highFractalIndex = rightPeriod+1; // this is used for the fractals
|
|
||||||
initLowFractalsFromIndex(initFractalsPeriod,inputTimeFrameFractals);
|
|
||||||
initHighFractalsFromIndex(initFractalsPeriod,inputTimeFrameFractals);
|
|
||||||
|
|
||||||
// INITIALIZATION FLAG
|
|
||||||
initialized = true ;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//---
|
|
||||||
return(INIT_SUCCEEDED);
|
|
||||||
}
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
//| Expert deinitialization function |
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
void OnDeinit(const int reason)
|
|
||||||
{
|
|
||||||
//--- destroy timer
|
|
||||||
/*Print("Low Fractals:");
|
|
||||||
lowsContainer.printLowFractals();
|
|
||||||
Print(" ");
|
|
||||||
Print("High Fractals:");
|
|
||||||
highsContainer.printhighFractals();
|
|
||||||
Print(" "); */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
EventKillTimer();
|
|
||||||
|
|
||||||
}
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
//| Expert tick function |
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
void OnTick()
|
|
||||||
{
|
|
||||||
//---
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(newCandleDetectorLive.isNewCandle())
|
|
||||||
{
|
|
||||||
handleLowFractals(inputTimeFrameFractals); // scans low fractals that are forming and adds them to the container
|
|
||||||
handleHighFractals(inputTimeFrameFractals); // scans high fractals that are forming and adds them to the container
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
//| Timer function |
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
void OnTimer()
|
|
||||||
{
|
|
||||||
//---
|
|
||||||
|
|
||||||
}
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
//| Trade function |
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
void OnTrade()
|
|
||||||
{
|
|
||||||
//---
|
|
||||||
|
|
||||||
}
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
//| TradeTransaction function |
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
void OnTradeTransaction(const MqlTradeTransaction& trans,
|
|
||||||
const MqlTradeRequest& request,
|
|
||||||
const MqlTradeResult& result)
|
|
||||||
{
|
|
||||||
//---
|
|
||||||
|
|
||||||
}
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
//| Tester function |
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
double OnTester()
|
|
||||||
{
|
|
||||||
//---
|
|
||||||
double ret=0.0;
|
|
||||||
//---
|
|
||||||
|
|
||||||
//---
|
|
||||||
return(ret);
|
|
||||||
}
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
//| TesterInit function |
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
void OnTesterInit()
|
|
||||||
{
|
|
||||||
//---
|
|
||||||
|
|
||||||
}
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
//| TesterPass function |
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
void OnTesterPass()
|
|
||||||
{
|
|
||||||
//---
|
|
||||||
|
|
||||||
}
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
//| TesterDeinit function |
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
void OnTesterDeinit()
|
|
||||||
{
|
|
||||||
//---
|
|
||||||
|
|
||||||
}
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
//| ChartEvent function |
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
void OnChartEvent(const int id,
|
|
||||||
const long &lparam,
|
|
||||||
const double &dparam,
|
|
||||||
const string &sparam)
|
|
||||||
{
|
|
||||||
//---
|
|
||||||
//--- left-clicking on a chart
|
|
||||||
|
|
||||||
switch(id)
|
|
||||||
{
|
|
||||||
|
|
||||||
case CHARTEVENT_CLICK:
|
|
||||||
{
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//--- clicking on a graphical object
|
|
||||||
case CHARTEVENT_OBJECT_CLICK:
|
|
||||||
{
|
|
||||||
if(sparam == "ZONE_ADD_BTN")
|
|
||||||
{
|
|
||||||
|
|
||||||
if(objectConfUnit.getWaitingStatus() == false) // THIS IS TO MAKE SURE THERE IS NO OTHER OBJECT SELECTED
|
|
||||||
{
|
|
||||||
|
|
||||||
// create a rectangle with a unique name
|
|
||||||
int currentIdCounter = zoneContainer.getZonesIdCounter();
|
|
||||||
objectsManager.drawRectangle(currentIdCounter); // create a rectangle . set its name to be the current zonesIdCounter (and that would be the id of this current zone )
|
|
||||||
objectConfUnit.setWaitingStatus(true);
|
|
||||||
objectConfUnit.setObjectType("OBJ_RECTANGLE");
|
|
||||||
objectConfUnit.setConfirmationObjectId(currentIdCounter);
|
|
||||||
zoneContainer.incrementZonesIdCounter();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
Print("Failed to Add a new Object, Make sure to confirm the previous object first! .");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
if(sparam == "CONFIRM_BTN")
|
|
||||||
{
|
|
||||||
|
|
||||||
if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THAT THERE IS SOMETHING SELECTED TO BE CONFIRMED
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
if(objectConfUnit.getObjectType() == "OBJ_RECTANGLE") // CASE OF ZONE
|
|
||||||
{
|
|
||||||
|
|
||||||
if(zoneContainer.getZoneIndex(objectConfUnit.getConfirmationObjectId()) != -1) // means the zone already in the data structure, in this case we just need to update it
|
|
||||||
{
|
|
||||||
|
|
||||||
// update the zone attributes
|
|
||||||
// zoneContainer.UpdateZone(int id);
|
|
||||||
Zone* tempZone = new Zone();
|
|
||||||
|
|
||||||
tempZone.setHigherEdgePrice(tempObjectAttr.getHigherEdgePrice()) ;
|
|
||||||
tempZone.setLowerEdgePrice(tempObjectAttr.getLowerEdgePrice());
|
|
||||||
tempZone.setLeftEdge(tempObjectAttr.getLeftEdgeTime());
|
|
||||||
tempZone.setRightEdge(tempObjectAttr.getRightEdgeTime());
|
|
||||||
tempZone.setTimeFrame(tempObjectAttr.getTimeFrame());
|
|
||||||
|
|
||||||
string idOfOriginalZone = objectConfUnit.getConfirmationObjectId();
|
|
||||||
// no need to set the ID here because the ID belongs to the original zone and not this new temp one (this is just a temporary zone to check if the adjustment is valid or no)
|
|
||||||
|
|
||||||
if(zoneContainer.updateZone(tempZone, idOfOriginalZone) ==1)
|
|
||||||
{
|
|
||||||
// in this case we successfully updated the zone
|
|
||||||
|
|
||||||
Print("Updated the object:" +
|
|
||||||
"\n ID: " + objectConfUnit.getConfirmationObjectId() +
|
|
||||||
"\n Type: " + objectConfUnit.getObjectType() +
|
|
||||||
"\n Asset: " + tempObjectAttr.getSymbol() +
|
|
||||||
"\n Time Frame:" + tempObjectAttr.getTimeFrame() +
|
|
||||||
"\n Higher Edge Price: " + tempObjectAttr.getHigherEdgePrice() +
|
|
||||||
"\n Lower Edge Price: " + tempObjectAttr.getLowerEdgePrice() +
|
|
||||||
"\n Left Edge Date: " + tempObjectAttr.getLeftEdgeTime() +
|
|
||||||
"\n Right Edge Date: " + tempObjectAttr.getRightEdgeTime()
|
|
||||||
);
|
|
||||||
|
|
||||||
delete tempZone;
|
|
||||||
if(ObjectSetInteger(_Symbol,objectConfUnit.getConfirmationObjectId(),OBJPROP_SELECTED,false) == true) // this is to unselect the object once we finish using it
|
|
||||||
{
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Print("Failed to unselect the object. Error: " + GetLastError());
|
|
||||||
}
|
|
||||||
|
|
||||||
// THIS IS TO CLEAN THE objectConfUnit
|
|
||||||
objectConfUnit.setWaitingStatus(false);
|
|
||||||
ChartRedraw();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
Print("Failed to update the zone, please reposition it");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
else // means the zone is new so we need to add it
|
|
||||||
{
|
|
||||||
Zone* newZone = new Zone() ;
|
|
||||||
newZone.setHigherEdgePrice(tempObjectAttr.getHigherEdgePrice());
|
|
||||||
newZone.setLowerEdgePrice(tempObjectAttr.getLowerEdgePrice());
|
|
||||||
newZone.setLeftEdge(tempObjectAttr.getLeftEdgeTime());
|
|
||||||
newZone.setRightEdge(tempObjectAttr.getRightEdgeTime());
|
|
||||||
newZone.setId(objectConfUnit.getConfirmationObjectId());
|
|
||||||
newZone.setTimeFrame(tempObjectAttr.getTimeFrame());
|
|
||||||
if(tempObjectAttr.getHigherEdgePrice() < SymbolInfoDouble(_Symbol, SYMBOL_ASK) ){ // means its a support zone
|
|
||||||
newZone.setType("TYPE_SUPPORT");
|
|
||||||
}
|
|
||||||
if(tempObjectAttr.getLowerEdgePrice() > SymbolInfoDouble(_Symbol, SYMBOL_ASK)){ // means its a resistance zone
|
|
||||||
newZone.setType("TYPE_RESISTANCE");
|
|
||||||
}
|
|
||||||
// add the zone to the data structure
|
|
||||||
if(zoneContainer.addZone(newZone) == 1)
|
|
||||||
{
|
|
||||||
zoneContainer.findOrUpdatePivotEdges(); // update the pivot edges
|
|
||||||
Print("Added the object:" +
|
|
||||||
"\n ID: " + objectConfUnit.getConfirmationObjectId() +
|
|
||||||
"\n Type: " + objectConfUnit.getObjectType() +
|
|
||||||
"\n Asset: " + tempObjectAttr.getSymbol() +
|
|
||||||
"\n Time Frame:" + tempObjectAttr.getTimeFrame() +
|
|
||||||
"\n Higher Edge Price: " + tempObjectAttr.getHigherEdgePrice() +
|
|
||||||
"\n Lower Edge Price: " + tempObjectAttr.getLowerEdgePrice() +
|
|
||||||
"\n Left Edge Date: " + tempObjectAttr.getLeftEdgeTime() +
|
|
||||||
"\n Right Edge Date: " + tempObjectAttr.getRightEdgeTime()
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(ObjectSetInteger(_Symbol,objectConfUnit.getConfirmationObjectId(),OBJPROP_SELECTED,false) == true) // this is to unselect the object once we finish using it
|
|
||||||
{
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Print("Failed to unselect the object. Error: " + GetLastError());
|
|
||||||
}
|
|
||||||
|
|
||||||
// THIS IS TO CLEAN THE objectConfUnit
|
|
||||||
objectConfUnit.setWaitingStatus(false);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Print("Failed to add the zone, Error: 2 or more zones are crossing");
|
|
||||||
}
|
|
||||||
|
|
||||||
ChartRedraw();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
if(objectConfUnit.getObjectType() == "OBJ_TRENDLINE") // CASE OF TRENDLINE
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
Print("Cannot confirm, Please select an object first !");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
if(sparam == "DELETE_BTN")
|
|
||||||
{
|
|
||||||
if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THAT THERE IS SOMETHING SELECTED TO BE DELETED
|
|
||||||
{
|
|
||||||
if(ObjectDelete(_Symbol,objectConfUnit.getConfirmationObjectId()))
|
|
||||||
{
|
|
||||||
if(zoneContainer.deleteZone(objectConfUnit.getConfirmationObjectId()) == 1)
|
|
||||||
{ // delete from data structure
|
|
||||||
zoneContainer.findOrUpdatePivotEdges();
|
|
||||||
Print("Deleted the object: " +
|
|
||||||
"\n Type: " + objectConfUnit.getObjectType() +
|
|
||||||
"\n ID: " + objectConfUnit.getConfirmationObjectId());
|
|
||||||
|
|
||||||
objectConfUnit.setWaitingStatus(false);
|
|
||||||
objectConfUnit.setObjectType("NO_OBJECT");
|
|
||||||
objectConfUnit.setConfirmationObjectId(-2);
|
|
||||||
|
|
||||||
ChartRedraw();
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
objectConfUnit.setWaitingStatus(false);
|
|
||||||
objectConfUnit.setObjectType("NO_OBJECT");
|
|
||||||
objectConfUnit.setConfirmationObjectId(-2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
Print("Cannot delete, Please select an object first !");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if(sparam == "EXIT_BTN")
|
|
||||||
{
|
|
||||||
delete objectsManager ;
|
|
||||||
delete objectConfUnit;
|
|
||||||
delete tempObjectAttr;
|
|
||||||
delete lowsContainer;
|
|
||||||
delete highsContainer;
|
|
||||||
|
|
||||||
delete newCandleDetectorLive;
|
|
||||||
zoneContainer.freeZonesSortedArray();
|
|
||||||
/*delete newCandleDetectorD1;
|
|
||||||
delete newCandleDetectorM5;
|
|
||||||
delete newCandleDetectorM30;
|
|
||||||
delete newCandleDetectorM15;
|
|
||||||
delete newCandleDetectorM1;
|
|
||||||
delete newCandleDetectorH4;
|
|
||||||
delete newCandleDetectorH1; */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ExpertRemove();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if(sparam == "PRINT_FRACTAL_BTN")
|
|
||||||
{
|
|
||||||
Print("Low Fractals:");
|
|
||||||
lowsContainer.printLowFractals();
|
|
||||||
Print("High Fractals:");
|
|
||||||
highsContainer.printHighFractals();
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
if(sparam == "PRINT_ZONES_BTN")
|
|
||||||
{
|
|
||||||
|
|
||||||
zoneContainer.printZonesSortedArray();
|
|
||||||
}
|
|
||||||
else // THIS is the case were we click on any object except for the 'Add Zone' and 'Confirm Object' Buttons
|
|
||||||
{
|
|
||||||
|
|
||||||
if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THERE IS NO OTHER OBJECT SELECTED
|
|
||||||
{
|
|
||||||
Print("Cannot select the object clicked, Make sure to confirm a previous selected object first !");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ObjectSetInteger(_Symbol,sparam,OBJPROP_SELECTED,true);
|
|
||||||
|
|
||||||
if(ObjectGetInteger(_Symbol,sparam,OBJPROP_TYPE,0) == OBJ_RECTANGLE)
|
|
||||||
{
|
|
||||||
Print("Selected the object:" +
|
|
||||||
"\n Type: OBJ_RECTANGLE" +
|
|
||||||
"\n ID: " + sparam);
|
|
||||||
objectConfUnit.setWaitingStatus(true) ;
|
|
||||||
objectConfUnit.setConfirmationObjectId(StringToInteger(sparam));
|
|
||||||
objectConfUnit.setObjectType("OBJ_RECTANGLE");
|
|
||||||
ChartRedraw();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//--- object moved or anchor point coordinates changed
|
|
||||||
case CHARTEVENT_OBJECT_DRAG:
|
|
||||||
{
|
|
||||||
|
|
||||||
double _higherEdgePrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,1);
|
|
||||||
double _lowerEdgePrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0);
|
|
||||||
|
|
||||||
datetime _leftEdgeTime = (datetime)ObjectGetInteger(_Symbol,sparam,OBJPROP_TIME,0);
|
|
||||||
datetime _rightEdgeTime = (datetime)ObjectGetInteger(_Symbol,sparam,OBJPROP_TIME,1);
|
|
||||||
|
|
||||||
if(_higherEdgePrice < _lowerEdgePrice) // this is the case were the user flips the rectangle while adjusting it.
|
|
||||||
{
|
|
||||||
tempObjectAttr.setHigherEdgePrice(_lowerEdgePrice);
|
|
||||||
tempObjectAttr.setLowerEdgePrice(_higherEdgePrice);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tempObjectAttr.setHigherEdgePrice(_higherEdgePrice);
|
|
||||||
tempObjectAttr.setLowerEdgePrice(_lowerEdgePrice);
|
|
||||||
}
|
|
||||||
|
|
||||||
tempObjectAttr.setLeftEdgeTime(_leftEdgeTime);
|
|
||||||
tempObjectAttr.setRightEdgeTime(_rightEdgeTime);
|
|
||||||
tempObjectAttr.setSymbol();
|
|
||||||
tempObjectAttr.setTimeFrame(getChartTimeFrameInString());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
//| BookEvent function |
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
void OnBookEvent(const string &symbol)
|
|
||||||
{
|
|
||||||
//---
|
|
||||||
|
|
||||||
}
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
//| |
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
void initLowFractalsFromIndex(int _index,ENUM_TIMEFRAMES timeFramePeriod)
|
|
||||||
{
|
|
||||||
|
|
||||||
for(int i=_index ; i> rightPeriod ; i--)
|
|
||||||
{
|
|
||||||
|
|
||||||
bool accessDeniedLows = false ; // variable for dealing with equal consecutive fractals
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(isLowFractalByIndex(i,leftPeriod,rightPeriod,timeFramePeriod) == true)
|
|
||||||
{
|
|
||||||
|
|
||||||
if(lowsContainer.getFreeIndex() > 0)
|
|
||||||
{
|
|
||||||
|
|
||||||
if(iLow(Symbol(),timeFramePeriod,i) == lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getPrice()) // if low fractal is equal to the previous low fractal
|
|
||||||
{
|
|
||||||
if(lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getDistance() - i < 2*rightPeriod) // if the 2 lows are inside the range of 2 times of right period
|
|
||||||
{
|
|
||||||
accessDeniedLows = true ;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(accessDeniedLows == false)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
LowFractal* currentFractal = new LowFractal(iLow(Symbol(),timeFramePeriod,i),leftPeriod,rightPeriod,TimeCurrent(),timeFramePeriod);
|
|
||||||
currentFractal.setDate(iTime(Symbol(),timeFramePeriod,i));
|
|
||||||
currentFractal.setDistance(i);
|
|
||||||
int NumberOfCandle = i-1;
|
|
||||||
string NumberOfCandleText = IntegerToString(NumberOfCandle);
|
|
||||||
currentFractal.setArrowObjName(NumberOfCandleText);
|
|
||||||
lowsContainer.addLowFractal(currentFractal);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
//| |
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
void initHighFractalsFromIndex(int _index,ENUM_TIMEFRAMES timeFramePeriod)
|
|
||||||
{
|
|
||||||
|
|
||||||
for(int i=_index ; i> rightPeriod ; i--)
|
|
||||||
{
|
|
||||||
|
|
||||||
bool accessDeniedHighs = false ; // variable for dealing with equal consecutive fractals
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(isHighFractalByIndex(i,leftPeriod,rightPeriod,timeFramePeriod) == true)
|
|
||||||
{
|
|
||||||
|
|
||||||
if(highsContainer.getFreeIndex() > 0)
|
|
||||||
{
|
|
||||||
|
|
||||||
if(iHigh(Symbol(),timeFramePeriod,i) == highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getPrice()) // if high fractal is equal to the previous high fractal
|
|
||||||
{
|
|
||||||
|
|
||||||
if(highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getDistance() - i < 2*rightPeriod) // if the 2 highs are inside the range of 2 times of right period
|
|
||||||
{
|
|
||||||
|
|
||||||
accessDeniedHighs = true ;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(accessDeniedHighs == false)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
HighFractal* currentFractal = new HighFractal(iHigh(Symbol(),timeFramePeriod,i),leftPeriod,rightPeriod,TimeCurrent(),timeFramePeriod);
|
|
||||||
currentFractal.setDate(iTime(Symbol(),timeFramePeriod,i));
|
|
||||||
currentFractal.setDistance(i);
|
|
||||||
int NumberOfCandle = i-1;
|
|
||||||
string NumberOfCandleText = IntegerToString(NumberOfCandle);
|
|
||||||
currentFractal.setArrowObjName(NumberOfCandleText);
|
|
||||||
highsContainer.addHighFractal(currentFractal);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
//| |
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
void handleLowFractals(ENUM_TIMEFRAMES tf)
|
|
||||||
{
|
|
||||||
|
|
||||||
bool accessDeniedLows = false ; // variable for dealing with equal consecutive fractals if its true, then the current fractal will not be added
|
|
||||||
|
|
||||||
for(int x=0 ; x<lowsContainer.getFreeIndex(); x++)
|
|
||||||
{
|
|
||||||
|
|
||||||
lowsContainer.getLowFractal(x).updateDistance(); // update the distance for every fractal in the container
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if(isLowFractalByIndex(lowFractalIndex,leftPeriod,rightPeriod,tf) == true)
|
|
||||||
{
|
|
||||||
|
|
||||||
if(lowsContainer.getFreeIndex() > 0)
|
|
||||||
{
|
|
||||||
|
|
||||||
if(iLow(Symbol(),tf,lowFractalIndex) == lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getPrice()) // if low fractal is equal to the previous low fractal
|
|
||||||
{
|
|
||||||
|
|
||||||
if(lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getDistance() <= 2*rightPeriod) // if the 2 lows are inside the range of 2 times of right period
|
|
||||||
{
|
|
||||||
|
|
||||||
accessDeniedLows = true ;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(accessDeniedLows == false)
|
|
||||||
{
|
|
||||||
|
|
||||||
LowFractal* currentFractal = new LowFractal(iLow(Symbol(),tf,lowFractalIndex),leftPeriod,rightPeriod,TimeCurrent(),tf);
|
|
||||||
|
|
||||||
int NumberOfCandle = Bars(Symbol(),tf);
|
|
||||||
string NumberOfCandleText = IntegerToString(NumberOfCandle);
|
|
||||||
currentFractal.setArrowObjName(NumberOfCandleText);
|
|
||||||
lowsContainer.addLowFractal(currentFractal);
|
|
||||||
Print("added a new low fractal !");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
//| |
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
void handleHighFractals(ENUM_TIMEFRAMES tf)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
bool accessDeniedHighs = false ; // variable for dealing with equal consecutive fractals
|
|
||||||
|
|
||||||
for(int x=0 ; x<highsContainer.getFreeIndex(); x++)
|
|
||||||
{
|
|
||||||
|
|
||||||
highsContainer.getHighFractal(x).updateDistance(); // update the distance for every fractal in the container
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if(isHighFractalByIndex(highFractalIndex,leftPeriod,rightPeriod,tf) == true)
|
|
||||||
{
|
|
||||||
|
|
||||||
if(highsContainer.getFreeIndex() > 0)
|
|
||||||
{
|
|
||||||
|
|
||||||
if(iHigh(Symbol(),tf,highFractalIndex) == highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getPrice()) // if high fractal is equal to the previous high fractal
|
|
||||||
{
|
|
||||||
if(highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getDistance() <= 2*rightPeriod) // if the 2 highs are inside the range of 2 times of right period
|
|
||||||
{
|
|
||||||
accessDeniedHighs = true ;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(accessDeniedHighs == false)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
HighFractal* currentFractal = new HighFractal(iHigh(Symbol(),tf,highFractalIndex),leftPeriod,rightPeriod,TimeCurrent(),tf);
|
|
||||||
|
|
||||||
int NumberOfCandle = Bars(Symbol(),tf);
|
|
||||||
string NumberOfCandleText = IntegerToString(NumberOfCandle);
|
|
||||||
currentFractal.setArrowObjName(NumberOfCandleText);
|
|
||||||
highsContainer.addHighFractal(currentFractal);
|
|
||||||
Print("added a new high fractal !");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
Reference in New Issue
Block a user