This commit is contained in:
2026-03-05 01:50:37 +03:30
parent 63281ee006
commit 59a718a1b5
16 changed files with 2199 additions and 9 deletions
+1 -1
View File
@@ -4,7 +4,7 @@
// -------------------------------------------------
// Name: XCXGuard ...
// Description: Guard Provider Class ...
//
// Ued in XCTradeManager ...
//
// Maintainer:
// ------------
File diff suppressed because it is too large Load Diff
+125
View File
@@ -27,6 +27,86 @@
"labels": [],
"checkboxes": [],
"comments": []
},
{
"id": "17260152-05db-4ae2-9d26-cd3d9ee75863",
"listId": "43249367-151b-4e78-bea5-b3c3f41b60ab",
"title": "Make Each Modules Separately and Attach Process on Each them ...",
"description": "there are several modules, documents them one by one and make all of them as runnable standalone ...",
"labels": [],
"checkboxes": [
{
"id": "2f40c757-baa3-40b1-a804-853c78fae93e",
"title": "XCAlert",
"checked": false
},
{
"id": "03287c82-52da-4084-be05-9ddead05f3c2",
"title": "XCTrade",
"checked": false
},
{
"id": "cbf27d79-5cab-4b10-b48c-e9317a6c7dff",
"title": "XCSessionDetector",
"checked": false
},
{
"id": "68f70f06-d649-48d3-8050-6024d1f6b0b3",
"title": "XCAccount",
"checked": false
},
{
"id": "ab337067-5b35-475e-a16e-48de97a79452",
"title": "XCVolume",
"checked": false
},
{
"id": "f618df8d-5d6c-4b4d-a6e1-b2f550a77509",
"title": "XCDataCollector",
"checked": false
},
{
"id": "9aea1e42-e9c9-4efd-85a8-3930335011b4",
"title": "XCRestrictions",
"checked": false
},
{
"id": "7e08c5e9-74f6-40c6-9a81-b60503d5a625",
"title": "XCBaseSignaller",
"checked": false
},
{
"id": "cfcc6686-0b3c-48e7-80f6-d3485f7ad717",
"title": "XCTarget",
"checked": false
},
{
"id": "40a72aea-865d-48b5-a48b-fe9972e8152d",
"title": "XCTradeManager",
"checked": false
}
],
"comments": []
},
{
"id": "05e10aba-f8b4-485c-9c79-bcfb4a58e80b",
"listId": "43249367-151b-4e78-bea5-b3c3f41b60ab",
"title": "Document XCAlert",
"description": "XCAlert is a Module for Alerting Tools Enabling.\nin this task we have to complete it's Documentations and then also we have to complete XCDataCollector and make it Usable.",
"labels": [],
"checkboxes": [
{
"id": "888d7a95-44c3-4388-9446-8e5d78a0a0d1",
"title": "add Log Saving Methods",
"checked": false
},
{
"id": "38bfd420-21fb-436a-abc6-7239da6559ae",
"title": "add Support for Per File Logging",
"checked": false
}
],
"comments": []
}
]
},
@@ -34,6 +114,26 @@
"id": "0c9df632-b6cd-4d3f-9c08-fbe7010ecc4e",
"title": "Test",
"cards": [
{
"id": "e487c35e-b69d-41b4-bdae-ef8502ecc1dc",
"listId": "0c9df632-b6cd-4d3f-9c08-fbe7010ecc4e",
"title": "Document XCDataCollector",
"description": "since DataCollector is a most commonly used Module in other Modules as Dependency, it is very important to make them completely documented and also add required Features to it.",
"labels": [],
"checkboxes": [
{
"id": "3357aca6-1906-44e2-8c9c-1c8d3b576f43",
"title": "Add Suppoprt for CSV Read and Writing",
"checked": true
}
],
"comments": [
{
"id": "4e454ff4-88d3-41ea-b5d7-0d7cbf70c660",
"comment": "CSV since implemented based on Custom Specified Structures. this module provides all requirements implemented."
}
]
},
{
"id": "5549ff02-ce37-476f-9d91-ed190ca15e90",
"listId": "0c9df632-b6cd-4d3f-9c08-fbe7010ecc4e",
@@ -51,6 +151,31 @@
"labels": [],
"checkboxes": [],
"comments": []
},
{
"id": "504383b7-0a6d-4c78-afe4-be3cf59ed2bd",
"listId": "0c9df632-b6cd-4d3f-9c08-fbe7010ecc4e",
"title": "Complete Restrictions Class ...",
"description": "",
"labels": [],
"checkboxes": [
{
"id": "7e422b9e-e5f4-4ea7-ab6e-b2225b8d9a67",
"title": "add multiple symbol support",
"checked": true
},
{
"id": "65f6807b-f664-4e30-be27-06799032f16e",
"title": "add mutiple tf support",
"checked": true
},
{
"id": "c8a8c345-7dc2-48c8-bc04-11ccf221493f",
"title": "implement Process function",
"checked": true
}
],
"comments": []
}
]
},
+246
View File
@@ -0,0 +1,246 @@
<mxfile host="65bd71144e">
<diagram id="ivtA9_kKpv2f2q23DiRT" name="Page-1">
<mxGraphModel dx="1437" dy="1143" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="7" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="2" target="6">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="2" value="XCAlert" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="40" y="200" width="120" height="40" as="geometry"/>
</mxCell>
<mxCell id="5" style="edgeStyle=none;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="3" target="2">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="20" y="20"/>
<mxPoint x="20" y="100"/>
<mxPoint x="20" y="220"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="3" value="XTradeFramework Modules" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;" vertex="1" parent="1">
<mxGeometry x="40" width="760" height="40" as="geometry"/>
</mxCell>
<mxCell id="9" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="6" target="8">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="11" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="6" target="10">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="880" y="220"/>
<mxPoint x="880" y="300"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="13" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="6" target="12">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="880" y="220"/>
<mxPoint x="880" y="380"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="16" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="6" target="14">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="880" y="220"/>
<mxPoint x="880" y="460"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="18" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="6" target="15">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="880" y="220"/>
<mxPoint x="880" y="540"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="32" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="6" target="31">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="35" value="" style="edgeStyle=none;html=1;strokeColor=#FF0000;" edge="1" parent="1" source="6" target="31">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="6" value="Providing Alert Mechanism" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="560" y="200" width="240" height="40" as="geometry"/>
</mxCell>
<mxCell id="24" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="8" target="23">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="8" value="LogAlert()" style="whiteSpace=wrap;html=1;rounded=1;" vertex="1" parent="1">
<mxGeometry x="920" y="200" width="140" height="40" as="geometry"/>
</mxCell>
<mxCell id="26" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="10" target="25">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="10" value="TerminalAlert()" style="whiteSpace=wrap;html=1;rounded=1;" vertex="1" parent="1">
<mxGeometry x="920" y="280" width="140" height="40" as="geometry"/>
</mxCell>
<mxCell id="28" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="12" target="27">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="12" value="MailAlert()" style="whiteSpace=wrap;html=1;rounded=1;" vertex="1" parent="1">
<mxGeometry x="920" y="360" width="140" height="40" as="geometry"/>
</mxCell>
<mxCell id="30" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="14" target="29">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="14" value="PushAlert()" style="whiteSpace=wrap;html=1;rounded=1;" vertex="1" parent="1">
<mxGeometry x="920" y="440" width="140" height="40" as="geometry"/>
</mxCell>
<mxCell id="19" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;strokeColor=#0082FF;" edge="1" parent="1" source="15" target="14">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1080" y="540"/>
<mxPoint x="1080" y="460"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="20" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;strokeColor=#0082FF;" edge="1" parent="1" source="15" target="12">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1080" y="540"/>
<mxPoint x="1080" y="380"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="21" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;strokeColor=#0082FF;" edge="1" parent="1" source="15" target="10">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1080" y="540"/>
<mxPoint x="1080" y="300"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="22" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;strokeColor=#0082FF;" edge="1" parent="1" source="15" target="8">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1080" y="540"/>
<mxPoint x="1080" y="220"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="15" value="SendAlert()" style="whiteSpace=wrap;html=1;rounded=1;" vertex="1" parent="1">
<mxGeometry x="920" y="520" width="140" height="40" as="geometry"/>
</mxCell>
<mxCell id="23" value="Sending Logs as Print" style="whiteSpace=wrap;html=1;rounded=1;" vertex="1" parent="1">
<mxGeometry x="1160" y="200" width="200" height="40" as="geometry"/>
</mxCell>
<mxCell id="25" value="Sending Log to Terminal" style="whiteSpace=wrap;html=1;rounded=1;" vertex="1" parent="1">
<mxGeometry x="1160" y="280" width="200" height="40" as="geometry"/>
</mxCell>
<mxCell id="27" value="Sending Log as Mail" style="whiteSpace=wrap;html=1;rounded=1;" vertex="1" parent="1">
<mxGeometry x="1160" y="360" width="200" height="40" as="geometry"/>
</mxCell>
<mxCell id="29" value="Sending Log as Push Notification" style="whiteSpace=wrap;html=1;rounded=1;" vertex="1" parent="1">
<mxGeometry x="1160" y="440" width="200" height="40" as="geometry"/>
</mxCell>
<mxCell id="34" style="edgeStyle=none;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeColor=#FF0000;" edge="1" parent="1" source="31" target="33">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="20" y="320"/>
<mxPoint x="20" y="100"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="31" value="" style="rhombus;whiteSpace=wrap;html=1;rounded=1;" vertex="1" parent="1">
<mxGeometry x="640" y="280" width="80" height="80" as="geometry"/>
</mxCell>
<mxCell id="39" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="33" target="38">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="33" value="&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;XCDataCollector&lt;/span&gt;" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="40" y="80" width="120" height="40" as="geometry"/>
</mxCell>
<mxCell id="43" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="38" target="42">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="53" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="38" target="45">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1440" y="100"/>
<mxPoint x="1440" y="180"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="54" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="38" target="46">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1440" y="100"/>
<mxPoint x="1440" y="260"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="55" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="38" target="47">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1440" y="100"/>
<mxPoint x="1440" y="340"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="56" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="38" target="49">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1440" y="100"/>
<mxPoint x="1440" y="420"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="57" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="38" target="50">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1440" y="100"/>
<mxPoint x="1440" y="500"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="58" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="38" target="51">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1440" y="100"/>
<mxPoint x="1440" y="580"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="59" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="38" target="52">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1440" y="100"/>
<mxPoint x="1440" y="660"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="38" value="&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;Save and Retrieve Data&lt;/span&gt;" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="560" y="80" width="240" height="40" as="geometry"/>
</mxCell>
<mxCell id="42" value="&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;Save()&lt;/span&gt;" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="1480" y="80" width="160" height="40" as="geometry"/>
</mxCell>
<mxCell id="45" value="&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;Append()&lt;/span&gt;" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="1480" y="160" width="160" height="40" as="geometry"/>
</mxCell>
<mxCell id="46" value="&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;Read()&lt;/span&gt;" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="1480" y="240" width="160" height="40" as="geometry"/>
</mxCell>
<mxCell id="47" value="&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;IsExists()&lt;/span&gt;" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="1480" y="320" width="160" height="40" as="geometry"/>
</mxCell>
<mxCell id="49" value="&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;GetFileHandlerForRead()&lt;/span&gt;" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="1480" y="400" width="160" height="40" as="geometry"/>
</mxCell>
<mxCell id="50" value="&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;GetFileHandlerForWrite()&lt;/span&gt;" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="1480" y="480" width="160" height="40" as="geometry"/>
</mxCell>
<mxCell id="51" value="&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;GetFilePath()&lt;/span&gt;" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="1480" y="560" width="160" height="40" as="geometry"/>
</mxCell>
<mxCell id="52" value="&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;Path()&lt;/span&gt;" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="1480" y="640" width="160" height="40" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
View File
+11
View File
@@ -0,0 +1,11 @@
# XCAlert
it is a module which used for Providing Logs in SaherElm's XTrade Framework.
## Maintainer
Hadi Khazaee asl
[https://www.saherelm.ir](https://www.saherelm.ir)
[hadi_khazaee_asl@yahoo.com](mailto:hadi_khazaee_asl@yahoo.com)
View File
+80
View File
@@ -0,0 +1,80 @@
# XCDataCollector
it is a module which used for Save and Retrieve Data in SaherElm's XTrade Framework.
this tool helps all required modules to save data for next usage and analytics.
we can implement Save To File and Read From File actions to all Structures and Classes and Modules.
## Dependencies
there is no Dependencies on this modules.
## Instancing
there is not any args in Constructor.
## Instructions
- using Path Action of instance for Setting File Path;
- using Save, Append, Read for File Manipulations;
## Actions
### Path
is aProperty Setter and Getter Action for Setting Collector Path.
for setter it's have an input Parameters (string value) which Specified the File's Path.
### GetFilePath(string fileName)
retrieve Full path (including provided file name) based on Current Configured Path for instance.
### GetFileHandlerForWrite(string filePath)
retrieve File Handler by Write Access for Writing Data to File.
you have to provide Fully File Path for access Handler.
this for Use Implementing Custom Collecting Senarios out of Instance Box.
commonly it's used by built in Actions for Regular Saving Data.
### GetFileHandlerForRead(string filePath)
retrieve File Handler by Read Access for Reading Data from File.
you have to provide Fully File Path for access Handler.
this for Use Implementing Custom Retrieving Senarios out of Instance Box.
commonly it's used by built in Actions for Regular Reading Data.
### Save(string fileName, string content)
Save Specified Content to Specified File Nmae.
here the file name must Contains fully file path including file name.
it's only one time writing file. if it's file exists before overwrite it's content.
### Append(string fileName, string content)
Append Specified Contonet to end of Specified File.
here the file name must Contains fully file path including file name.
if file Exists, add to end of it. if not, Create file at Specified Provided path, then write content.
### Read(string fileName, string &content)
Read all of File Content at once from Specified File.
here the file name must Contains fully file path including file name.
content arg is a reference string variable to hold file content.
### Read(string fileName, string &content[])
Read all of File Content Lines at once from Specified File.
here the file name must Contains fully file path including file name.
content arg is a reference string array variable to hold file content lines.
### IsExists(string fileName)
Check Specified File Exists or not ...
here the file name must Contains fully file path including file name.
## Maintainer
Hadi Khazaee asl
[https://www.saherelm.ir](https://www.saherelm.ir)
[hadi_khazaee_asl@yahoo.com](mailto:hadi_khazaee_asl@yahoo.com)
View File
View File
View File
+11
View File
@@ -0,0 +1,11 @@
# XCTrade
it is a module which used for Providing Trade Related Actions in SaherElm's XTrade Framework.
## Maintainer
Hadi Khazaee asl
[https://www.saherelm.ir](https://www.saherelm.ir)
[hadi_khazaee_asl@yahoo.com](mailto:hadi_khazaee_asl@yahoo.com)
View File
View File
+125 -1
View File
@@ -25,6 +25,7 @@
#include "../Classes/x-saherelm.x-alert.class.mq5"
#include "../Classes/x-saherelm.x-chart.helper.class.mq5"
#include "../Classes/x-saherelm.x-guard.class.mq5"
#include "../Classes/x-saherelm.x-restrictions.class.mq5"
#include "../Classes/x-saherelm.x-target.class.mq5"
#include "../Classes/x-saherelm.x-trade-manager.class.mq5"
#include "../Classes/x-saherelm.x-trade.class.mq5"
@@ -90,11 +91,19 @@ input bool eaSaveLosts = true; // Save Lost Conditions
input bool eaSaveRestrictions = true; // Save Restriction Reports
// #endregion
// #region Configurable Documents ...
bool eaEnableAnalysis = true; // Most Important Flag for Enable Analysis in EA ...
bool processTicksOnlyOnNewBars = false; // Processing Ticks only on new Bars ...
ENUM_X_SESSION_TYPE eaAllowedSessions[]; // Allowed Sessions for Analysis ...
ENUM_X_SESSION_OVERLAP_TYPE eaAllowedOverlaps[]; // Allowed Overlaps for Analysis ...
// #endregion
// #region Global Variables ...
#define ShortName "XSessionDetectorTestEA"
//
string eaTag; // EA Scoped Tag ...
string eaTag; // EA Scoped Tag ...
bool isNewBar = false; // EA Is New Bar ...
//
XCAlert *eaAlert; // EA Scope Alert Handler ...
@@ -102,7 +111,9 @@ XCGuard *eaGuard; // EA Scope Guard Handler ...
XCTrade *eaTrader; // EA Scope Trade Handler ...
XCVolume *eaVolume; // EA Scope Voluem Handler ...
XCTarget *eaTarget; // EA Scope Target Handler ...
XBarTracker eaBarTracker; // EA Scope Bar Tracker ...
XTimeTracker eaTimeTracker; // EA Scope Time Tracker ...
XCRestrictions *eaRestrictions; // EA Scope Restrictions Handler ...
XCTradeManager *eaTradeManager; // EA Scope Trade Manager Handler ...
XCSessionDetector *eaSessionDetector; // EA Scope Session Detector ...
// #endregion
@@ -131,6 +142,10 @@ int OnInit()
return INIT_FAILED;
}
//
// Configure Dynamic Variables ...
ConfigureEA();
//
result = InitializeRequirements();
if (!result)
@@ -150,6 +165,35 @@ void OnTick()
//
// Perform Session Detector Process ...
eaSessionDetector.Process();
//
// Perform Restrictions Process ...
eaRestrictions.Process();
//
// Check if Is New Bar ...
isNewBar = eaBarTracker.IsNewBar();
//
// Check Analysis Enabled ...
if (eaEnableAnalysis)
{
//
// Check Bar Tracker ...
if (processTicksOnlyOnNewBars)
{
//
// Check New Bar or not ...
if (!isNewBar)
{
return;
}
}
//
// Do Analysis ...
// TODO: Implement this ...
}
}
/**
@@ -157,6 +201,9 @@ void OnTick()
*/
void OnTrade()
{
//
// Calling Event Handler ...
eaTrader.HandleOnTrade();
}
/**
@@ -202,6 +249,7 @@ void OnDeinit(const int reason)
ZeroMemory(eaVolume);
ZeroMemory(eaTarget);
ZeroMemory(eaTradeManager);
ZeroMemory(eaRestrictions);
ZeroMemory(eaSessionDetector);
}
@@ -273,6 +321,32 @@ bool ValidateInputs()
return result;
}
/**
* Configure EA Commons ...
*/
void ConfigureEA()
{
//
// Configure Sessions ...
//
// Configure Overlaps ...
Add(
X_OVERLAP_LONDON_NEWYORK,
eaAllowedOverlaps //
);
//
// Startup eaAnalysis State ...
int sessionsCount = ArraySize(eaAllowedSessions);
int overlapsCount = ArraySize(eaAllowedOverlaps);
//
eaEnableAnalysis =
!IsValidSize(sessionsCount) &&
!IsValidSize(overlapsCount);
}
/**
* Initial Requirements of EA ...
*
@@ -291,6 +365,17 @@ bool InitializeRequirements()
: "") +
ShortName;
// #region Initializing Bar Tracker ...
result = eaBarTracker.Init(
_Symbol,
_Period //
);
if (!result)
{
return result;
}
// #endregion
// #region Alert ...
eaAlert = new XCAlert();
eaAlert.SetPrefix(eaLogSuffix);
@@ -415,6 +500,23 @@ bool InitializeRequirements()
);
// #endregion
// #region Restrictions Handler ...
eaRestrictions = new XCRestrictions();
//
// Configure Restrictions ...
// TODO: Refactor Restrictions Configurations as Input ...
eaRestrictions.SetAllowedLosesInRestrictions(2);
eaRestrictions.SetAllowedTradesInRestrictions(2);
eaRestrictions.SetRestrictionsPeriodMultiplier(2);
eaRestrictions.SetRestrictionsPeriod(X_TRADE_RESTRICATION_DAILY);
//
// Register Event Handlers ...
eaRestrictions.AddRestrictionsEndEventHandler(OnRestrictionsEnd);
eaRestrictions.AddRestrictionsStartEventHandler(OnRestrictionsStart);
// #endregion
//
result = eaSessionDetector != NULL;
if (!result)
@@ -518,7 +620,11 @@ void OnOverlapStartHandler(
datetime startTime //
)
{
//
Print("Overlap Started: ", EnumToString(overlap), " at ", TimeToString(startTime));
//
// Check Over lap Exists in eaSession Everlaps ...
}
/**
@@ -643,6 +749,24 @@ void OnPositionPartialClosed(
void OnTradeStateChanged(const XOnTradeHandlerState &state)
{
}
/**
* Handle Restrictions Start Event ...
* XCRestrictions ...
*/
void OnRestrictionsStart()
{
Print("Restrictions Start ...");
}
/**
* Handle Restrictions End Event ...
* XCRestrictions ...
*/
void OnRestrictionsEnd()
{
Print("Restrictions End ...");
}
// #endregion
//
+6 -2
View File
@@ -156,6 +156,10 @@ bool IsValid(ENUM_X_POSITION_TYPES value)
{
return value != X_POSITION_TYPE_NONE;
}
bool IsXValid(ENUM_X_POSITION_TYPES value)
{
return IsValid(value);
}
//
bool HasSpecifiedType(ENUM_X_POSITION_TYPES value)
@@ -4688,8 +4692,8 @@ bool IsProviderFilterPassed(
//
return !IsValid(provider)
? true
: provider == item.provider ||
Contains(provider, item.provider);
: provider == item.provider ||
Contains(provider, item.provider);
}
//