update code
This commit is contained in:
@@ -111,6 +111,8 @@ double SpotPrice = 0.0;
|
||||
|
||||
double CallLevels[3];
|
||||
double PutLevels[3];
|
||||
int CallOI[3];
|
||||
int PutOI[3];
|
||||
|
||||
double DynamicFuturePrice = 0.0;
|
||||
double DynamicCallStrike1 = 0.0;
|
||||
@@ -194,17 +196,9 @@ double CurrentBarHigh = 0.0;
|
||||
double CurrentBarLow = 0.0;
|
||||
double LastPrice = 0.0;
|
||||
|
||||
double CachedFuturePrice = -1; // -1 = not loaded, 0 = loaded but failed, >0 = success
|
||||
string LoadedCSVPath = ""; // Path from which CSV was successfully loaded
|
||||
bool CSVLoadLogged = false; // Track if we've logged the result
|
||||
|
||||
double CSVDynamicCallStrike1 = 0.0;
|
||||
double CSVDynamicCallStrike2 = 0.0;
|
||||
double CSVDynamicCallStrike3 = 0.0;
|
||||
double CSVDynamicPutStrike1 = 0.0;
|
||||
double CSVDynamicPutStrike2 = 0.0;
|
||||
double CSVDynamicPutStrike3 = 0.0;
|
||||
bool CSVStrikesLoaded = false;
|
||||
double CachedFuturePrice = -1;
|
||||
string LoadedCSVPath = "";
|
||||
bool CSVLoadLogged = false;
|
||||
|
||||
int OnInit() {
|
||||
Trade.SetExpertMagicNumber(InpMagicNumber);
|
||||
@@ -214,7 +208,7 @@ int OnInit() {
|
||||
SymbolInfo.Name(_Symbol);
|
||||
SymbolInfo.RefreshRates();
|
||||
|
||||
DynamicFuturePrice = InpManualFuturePrice;
|
||||
DynamicFuturePrice = InpManualFuturePrice;
|
||||
DynamicCallStrike1 = InpCallStrike1;
|
||||
DynamicCallStrike2 = InpCallStrike2;
|
||||
DynamicCallStrike3 = InpCallStrike3;
|
||||
@@ -226,8 +220,7 @@ int OnInit() {
|
||||
InitializeKeyLevels();
|
||||
|
||||
if(InpOISource == OI_SOURCE_CSV_FILE) {
|
||||
LoadFuturePriceFromCSV();
|
||||
ApplyCSVStrikeLevels();
|
||||
LoadOIFromCSV();
|
||||
}
|
||||
|
||||
if(!InitializeIndicators()) {
|
||||
@@ -446,15 +439,18 @@ void DetectAbsorptionFromHistory() {
|
||||
}
|
||||
|
||||
void UpdateMarketData() {
|
||||
SpotPrice = SymbolInfo.Bid();
|
||||
SymbolInfo.RefreshRates();
|
||||
|
||||
if(InpOISource == OI_SOURCE_CSV_FILE) {
|
||||
FuturePrice = LoadFuturePriceFromCSV();
|
||||
} else {
|
||||
FuturePrice = 0;
|
||||
}
|
||||
}
|
||||
SpotPrice = SymbolInfo.Bid();
|
||||
SymbolInfo.RefreshRates();
|
||||
|
||||
if(InpOISource == OI_SOURCE_CSV_FILE) {
|
||||
if(CachedFuturePrice < 0) {
|
||||
LoadOIFromCSV();
|
||||
}
|
||||
FuturePrice = CachedFuturePrice;
|
||||
} else {
|
||||
FuturePrice = 0;
|
||||
}
|
||||
}
|
||||
|
||||
bool IsPriceNearPutStrike() {
|
||||
double tolerance = InpOIZonePoints * _Point;
|
||||
@@ -940,14 +936,22 @@ void CloseAllPositions() {
|
||||
}
|
||||
|
||||
void InitializeOILevels() {
|
||||
CallLevels[0] = DynamicCallStrike1;
|
||||
CallLevels[1] = DynamicCallStrike2;
|
||||
CallLevels[2] = DynamicCallStrike3;
|
||||
|
||||
PutLevels[0] = DynamicPutStrike1;
|
||||
PutLevels[1] = DynamicPutStrike2;
|
||||
PutLevels[2] = DynamicPutStrike3;
|
||||
}
|
||||
CallLevels[0] = DynamicCallStrike1;
|
||||
CallLevels[1] = DynamicCallStrike2;
|
||||
CallLevels[2] = DynamicCallStrike3;
|
||||
|
||||
PutLevels[0] = DynamicPutStrike1;
|
||||
PutLevels[1] = DynamicPutStrike2;
|
||||
PutLevels[2] = DynamicPutStrike3;
|
||||
|
||||
CallOI[0] = 0;
|
||||
CallOI[1] = 0;
|
||||
CallOI[2] = 0;
|
||||
|
||||
PutOI[0] = 0;
|
||||
PutOI[1] = 0;
|
||||
PutOI[2] = 0;
|
||||
}
|
||||
|
||||
void InitializeKeyLevels() {
|
||||
double allLevels[];
|
||||
@@ -1001,180 +1005,114 @@ bool InitializeIndicators() {
|
||||
return true;
|
||||
}
|
||||
|
||||
double LoadFuturePriceFromCSV() {
|
||||
if(CachedFuturePrice >= 0 && CachedFuturePrice != 0) {
|
||||
return CachedFuturePrice;
|
||||
}
|
||||
void LoadOIFromCSV()
|
||||
{
|
||||
string paths[];
|
||||
int pathCount = 0;
|
||||
|
||||
string paths[];
|
||||
int pathCount = 0;
|
||||
ArrayResize(paths, 5);
|
||||
paths[pathCount++] = InpOICsvPath;
|
||||
paths[pathCount++] = "oi_data.csv";
|
||||
paths[pathCount++] = "\\Files\\oi_data.csv";
|
||||
paths[pathCount++] = "..\\oi_scraper\\oi_data.csv";
|
||||
paths[pathCount++] = "../oi_scraper/oi_data.csv";
|
||||
|
||||
ArrayResize(paths, 5);
|
||||
paths[pathCount++] = InpOICsvPath;
|
||||
paths[pathCount++] = "oi_data.csv";
|
||||
paths[pathCount++] = "\\Files\\oi_data.csv";
|
||||
paths[pathCount++] = "..\\oi_scraper\\oi_data.csv";
|
||||
paths[pathCount++] = "../oi_scraper/oi_data.csv";
|
||||
int filehandle = INVALID_HANDLE;
|
||||
string foundPath = "";
|
||||
|
||||
int filehandle = INVALID_HANDLE;
|
||||
string foundPath = "";
|
||||
for(int i = 0; i < pathCount; i++) {
|
||||
if(!CSVLoadLogged) {
|
||||
Print("Trying CSV path: ", paths[i]);
|
||||
}
|
||||
filehandle = FileOpen(paths[i], FILE_READ | FILE_CSV | FILE_ANSI, ',');
|
||||
if(filehandle != INVALID_HANDLE) {
|
||||
foundPath = paths[i];
|
||||
if(!CSVLoadLogged) {
|
||||
Print("Found CSV file at: ", foundPath);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for(int i = 0; i < pathCount; i++) {
|
||||
if(!CSVLoadLogged) {
|
||||
Print("Trying CSV path: ", paths[i]);
|
||||
}
|
||||
filehandle = FileOpen(paths[i], FILE_READ | FILE_CSV | FILE_ANSI, ',');
|
||||
if(filehandle != INVALID_HANDLE) {
|
||||
foundPath = paths[i];
|
||||
if(!CSVLoadLogged) {
|
||||
Print("Found CSV file at: ", foundPath);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(filehandle == INVALID_HANDLE) {
|
||||
if(!CSVLoadLogged) {
|
||||
Print("CSV ERROR: File not found. Searched paths:");
|
||||
for(int i = 0; i < pathCount; i++) {
|
||||
Print(" - ", paths[i]);
|
||||
}
|
||||
CSVLoadLogged = true;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if(filehandle == INVALID_HANDLE) {
|
||||
if(!CSVLoadLogged) {
|
||||
Print("CSV ERROR: File not found. Searched paths:");
|
||||
for(int i = 0; i < pathCount; i++) {
|
||||
Print(" - ", paths[i]);
|
||||
}
|
||||
CSVLoadLogged = true;
|
||||
}
|
||||
CachedFuturePrice = 0;
|
||||
return 0.0;
|
||||
}
|
||||
int callIndex = 0;
|
||||
int putIndex = 0;
|
||||
double futurePrice = 0.0;
|
||||
|
||||
double futurePrice = 0.0;
|
||||
double callStrikes[];
|
||||
double putStrikes[];
|
||||
int callCount = 0;
|
||||
int putCount = 0;
|
||||
bool inPriceSection = false;
|
||||
int dataLineCount = 0;
|
||||
while(!FileIsEnding(filehandle) && (callIndex < 3 || putIndex < 3))
|
||||
{
|
||||
string row = FileReadString(filehandle);
|
||||
string data[];
|
||||
int count = StringSplit(row, ',', data);
|
||||
|
||||
while(!FileIsEnding(filehandle)) {
|
||||
string line = FileReadString(filehandle);
|
||||
dataLineCount++;
|
||||
if(count >= 3)
|
||||
{
|
||||
string type = data[0];
|
||||
double strike = StringToDouble(data[1]);
|
||||
int oi = (int)StringToInteger(data[2]);
|
||||
|
||||
if(line == "") {
|
||||
inPriceSection = true;
|
||||
continue;
|
||||
}
|
||||
if(StringFind(type, "Future") >= 0)
|
||||
{
|
||||
futurePrice = strike;
|
||||
if(!CSVLoadLogged) {
|
||||
Print("DEBUG: Parsed Future price: ", futurePrice);
|
||||
}
|
||||
}
|
||||
else if(type == "CALL" && callIndex < 3)
|
||||
{
|
||||
CallLevels[callIndex] = strike;
|
||||
CallOI[callIndex] = oi;
|
||||
callIndex++;
|
||||
}
|
||||
else if(type == "PUT" && putIndex < 3)
|
||||
{
|
||||
PutLevels[putIndex] = strike;
|
||||
PutOI[putIndex] = oi;
|
||||
putIndex++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(dataLineCount == 1 && StringGetCharacter(line, 0) == 0xFEFF) {
|
||||
line = StringSubstr(line, 1);
|
||||
if(line == "") {
|
||||
inPriceSection = true;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
FileClose(filehandle);
|
||||
|
||||
if(StringFind(line, "Type") >= 0 || StringFind(line, "Strike") >= 0 || StringFind(line, "OI") >= 0) {
|
||||
continue;
|
||||
}
|
||||
for(int i = callIndex; i < 3; i++)
|
||||
{
|
||||
CallLevels[i] = 0;
|
||||
CallOI[i] = 0;
|
||||
}
|
||||
|
||||
if(line == "[Price]" || inPriceSection) {
|
||||
inPriceSection = true;
|
||||
string parts[];
|
||||
int split = StringSplit(line, ',', parts);
|
||||
|
||||
if(split >= 2 && parts[0] == "FuturePrice") {
|
||||
string priceStr = parts[1];
|
||||
while(StringLen(priceStr) > 0 && (StringGetCharacter(priceStr, 0) == 32 || StringGetCharacter(priceStr, 0) == 9)) {
|
||||
priceStr = StringSubstr(priceStr, 1);
|
||||
}
|
||||
while(StringLen(priceStr) > 0 && (StringGetCharacter(priceStr, StringLen(priceStr)-1) == 32 || StringGetCharacter(priceStr, StringLen(priceStr)-1) == 9)) {
|
||||
priceStr = StringSubstr(priceStr, 0, StringLen(priceStr)-1);
|
||||
}
|
||||
futurePrice = StringToDouble(priceStr);
|
||||
if(!CSVLoadLogged) {
|
||||
Print("DEBUG: Parsed FuturePrice: ", futurePrice);
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
for(int i = putIndex; i < 3; i++)
|
||||
{
|
||||
PutLevels[i] = 0;
|
||||
PutOI[i] = 0;
|
||||
}
|
||||
|
||||
string parts[];
|
||||
int split = StringSplit(line, ',', parts);
|
||||
if(futurePrice > 0) {
|
||||
CachedFuturePrice = futurePrice;
|
||||
DynamicFuturePrice = futurePrice;
|
||||
LoadedCSVPath = foundPath;
|
||||
CSVLoadLogged = true;
|
||||
Print("CSV SUCCESS: FuturePrice=", futurePrice, ", CALL=[", CallLevels[0], ",", CallLevels[1], ",", CallLevels[2], "], PUT=[", PutLevels[0], ",", PutLevels[1], ",", PutLevels[2], "] loaded from ", foundPath);
|
||||
} else {
|
||||
if(!CSVLoadLogged) {
|
||||
Print("CSV ERROR: No valid price found in ", foundPath);
|
||||
CSVLoadLogged = true;
|
||||
}
|
||||
CachedFuturePrice = 0;
|
||||
}
|
||||
|
||||
if(split >= 3) {
|
||||
string typeStr = parts[0];
|
||||
string strikeStr = parts[1];
|
||||
string oiStr = parts[2];
|
||||
|
||||
while(StringLen(strikeStr) > 0 && (StringGetCharacter(strikeStr, 0) == 32 || StringGetCharacter(strikeStr, 0) == 9)) {
|
||||
strikeStr = StringSubstr(strikeStr, 1);
|
||||
}
|
||||
while(StringLen(strikeStr) > 0 && (StringGetCharacter(strikeStr, StringLen(strikeStr)-1) == 32 || StringGetCharacter(strikeStr, StringLen(strikeStr)-1) == 9)) {
|
||||
strikeStr = StringSubstr(strikeStr, 0, StringLen(strikeStr)-1);
|
||||
}
|
||||
|
||||
double strike = StringToDouble(strikeStr);
|
||||
if(strike <= 0) continue;
|
||||
|
||||
if(typeStr == "CALL") {
|
||||
ArrayResize(callStrikes, callCount + 1);
|
||||
callStrikes[callCount] = strike;
|
||||
callCount++;
|
||||
} else if(typeStr == "PUT") {
|
||||
ArrayResize(putStrikes, putCount + 1);
|
||||
putStrikes[putCount] = strike;
|
||||
putCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FileClose(filehandle);
|
||||
|
||||
if(callCount > 0) {
|
||||
ArraySort(callStrikes);
|
||||
if(callCount >= 1) CSVDynamicCallStrike1 = callStrikes[callCount-1];
|
||||
if(callCount >= 2) CSVDynamicCallStrike2 = callStrikes[callCount-2];
|
||||
if(callCount >= 3) CSVDynamicCallStrike3 = callStrikes[callCount-3];
|
||||
}
|
||||
|
||||
if(putCount > 0) {
|
||||
ArraySort(putStrikes);
|
||||
if(putCount >= 1) CSVDynamicPutStrike1 = putStrikes[putCount-1];
|
||||
if(putCount >= 2) CSVDynamicPutStrike2 = putStrikes[putCount-2];
|
||||
if(putCount >= 3) CSVDynamicPutStrike3 = putStrikes[putCount-3];
|
||||
}
|
||||
|
||||
if(futurePrice > 0) {
|
||||
CachedFuturePrice = futurePrice;
|
||||
LoadedCSVPath = foundPath;
|
||||
CSVStrikesLoaded = true;
|
||||
if(!CSVLoadLogged) {
|
||||
Print("CSV SUCCESS: FuturePrice=", futurePrice, ", CALL=[", CSVDynamicCallStrike1, ",", CSVDynamicCallStrike2, ",", CSVDynamicCallStrike3, "], PUT=[", CSVDynamicPutStrike1, ",", CSVDynamicPutStrike2, ",", CSVDynamicPutStrike3, "] loaded from ", foundPath);
|
||||
CSVLoadLogged = true;
|
||||
}
|
||||
} else {
|
||||
if(!CSVLoadLogged) {
|
||||
Print("CSV ERROR: No valid price found in ", foundPath);
|
||||
Print(" - File exists but contains no parseable price data");
|
||||
Print(" - Total lines read: ", dataLineCount);
|
||||
CSVLoadLogged = true;
|
||||
}
|
||||
CachedFuturePrice = 0;
|
||||
}
|
||||
|
||||
return CachedFuturePrice;
|
||||
}
|
||||
|
||||
void ApplyCSVStrikeLevels() {
|
||||
if(!CSVStrikesLoaded) return;
|
||||
|
||||
if(DynamicCallStrike1 == 0 && CSVDynamicCallStrike1 > 0) DynamicCallStrike1 = CSVDynamicCallStrike1;
|
||||
if(DynamicCallStrike2 == 0 && CSVDynamicCallStrike2 > 0) DynamicCallStrike2 = CSVDynamicCallStrike2;
|
||||
if(DynamicCallStrike3 == 0 && CSVDynamicCallStrike3 > 0) DynamicCallStrike3 = CSVDynamicCallStrike3;
|
||||
if(DynamicPutStrike1 == 0 && CSVDynamicPutStrike1 > 0) DynamicPutStrike1 = CSVDynamicPutStrike1;
|
||||
if(DynamicPutStrike2 == 0 && CSVDynamicPutStrike2 > 0) DynamicPutStrike2 = CSVDynamicPutStrike2;
|
||||
if(DynamicPutStrike3 == 0 && CSVDynamicPutStrike3 > 0) DynamicPutStrike3 = CSVDynamicPutStrike3;
|
||||
|
||||
InitializeOILevels();
|
||||
InitializeKeyLevels();
|
||||
}
|
||||
InitializeKeyLevels();
|
||||
}
|
||||
|
||||
void CheckExistingPositions() {
|
||||
for(int i = 0; i < PositionsTotal(); i++) {
|
||||
@@ -1440,7 +1378,34 @@ void UpdateInputValues() {
|
||||
InitializeKeyLevels();
|
||||
|
||||
if(InpOISource == OI_SOURCE_CSV_FILE) {
|
||||
LoadFuturePriceFromCSV();
|
||||
ApplyCSVStrikeLevels();
|
||||
CachedFuturePrice = -1;
|
||||
LoadOIFromCSV();
|
||||
}
|
||||
}
|
||||
|
||||
if(ObjectGetString(chart_id, "CP_CallStrike1", OBJPROP_TEXT, 0, value)) {
|
||||
DynamicCallStrike1 = StringToDouble(value);
|
||||
}
|
||||
if(ObjectGetString(chart_id, "CP_CallStrike2", OBJPROP_TEXT, 0, value)) {
|
||||
DynamicCallStrike2 = StringToDouble(value);
|
||||
}
|
||||
if(ObjectGetString(chart_id, "CP_CallStrike3", OBJPROP_TEXT, 0, value)) {
|
||||
DynamicCallStrike3 = StringToDouble(value);
|
||||
}
|
||||
if(ObjectGetString(chart_id, "CP_PutStrike1", OBJPROP_TEXT, 0, value)) {
|
||||
DynamicPutStrike1 = StringToDouble(value);
|
||||
}
|
||||
if(ObjectGetString(chart_id, "CP_PutStrike2", OBJPROP_TEXT, 0, value)) {
|
||||
DynamicPutStrike2 = StringToDouble(value);
|
||||
}
|
||||
if(ObjectGetString(chart_id, "CP_PutStrike3", OBJPROP_TEXT, 0, value)) {
|
||||
DynamicPutStrike3 = StringToDouble(value);
|
||||
}
|
||||
|
||||
InitializeOILevels();
|
||||
InitializeKeyLevels();
|
||||
|
||||
if(InpOISource == OI_SOURCE_CSV_FILE) {
|
||||
LoadOIFromCSV();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user