update code

This commit is contained in:
Kunthawat Greethong
2026-01-08 12:48:05 +07:00
parent 143f2567c7
commit 92391f9d18
4 changed files with 2380 additions and 196 deletions

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -111,6 +111,8 @@ double SpotPrice = 0.0;
double CallLevels[3]; double CallLevels[3];
double PutLevels[3]; double PutLevels[3];
int CallOI[3];
int PutOI[3];
double DynamicFuturePrice = 0.0; double DynamicFuturePrice = 0.0;
double DynamicCallStrike1 = 0.0; double DynamicCallStrike1 = 0.0;
@@ -194,17 +196,9 @@ double CurrentBarHigh = 0.0;
double CurrentBarLow = 0.0; double CurrentBarLow = 0.0;
double LastPrice = 0.0; double LastPrice = 0.0;
double CachedFuturePrice = -1; // -1 = not loaded, 0 = loaded but failed, >0 = success double CachedFuturePrice = -1;
string LoadedCSVPath = ""; // Path from which CSV was successfully loaded string LoadedCSVPath = "";
bool CSVLoadLogged = false; // Track if we've logged the result bool CSVLoadLogged = false;
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;
int OnInit() { int OnInit() {
Trade.SetExpertMagicNumber(InpMagicNumber); Trade.SetExpertMagicNumber(InpMagicNumber);
@@ -226,8 +220,7 @@ int OnInit() {
InitializeKeyLevels(); InitializeKeyLevels();
if(InpOISource == OI_SOURCE_CSV_FILE) { if(InpOISource == OI_SOURCE_CSV_FILE) {
LoadFuturePriceFromCSV(); LoadOIFromCSV();
ApplyCSVStrikeLevels();
} }
if(!InitializeIndicators()) { if(!InitializeIndicators()) {
@@ -450,11 +443,14 @@ void UpdateMarketData() {
SymbolInfo.RefreshRates(); SymbolInfo.RefreshRates();
if(InpOISource == OI_SOURCE_CSV_FILE) { if(InpOISource == OI_SOURCE_CSV_FILE) {
FuturePrice = LoadFuturePriceFromCSV(); if(CachedFuturePrice < 0) {
LoadOIFromCSV();
}
FuturePrice = CachedFuturePrice;
} else { } else {
FuturePrice = 0; FuturePrice = 0;
} }
} }
bool IsPriceNearPutStrike() { bool IsPriceNearPutStrike() {
double tolerance = InpOIZonePoints * _Point; double tolerance = InpOIZonePoints * _Point;
@@ -947,7 +943,15 @@ void InitializeOILevels() {
PutLevels[0] = DynamicPutStrike1; PutLevels[0] = DynamicPutStrike1;
PutLevels[1] = DynamicPutStrike2; PutLevels[1] = DynamicPutStrike2;
PutLevels[2] = DynamicPutStrike3; PutLevels[2] = DynamicPutStrike3;
}
CallOI[0] = 0;
CallOI[1] = 0;
CallOI[2] = 0;
PutOI[0] = 0;
PutOI[1] = 0;
PutOI[2] = 0;
}
void InitializeKeyLevels() { void InitializeKeyLevels() {
double allLevels[]; double allLevels[];
@@ -1001,11 +1005,8 @@ bool InitializeIndicators() {
return true; return true;
} }
double LoadFuturePriceFromCSV() { void LoadOIFromCSV()
if(CachedFuturePrice >= 0 && CachedFuturePrice != 0) { {
return CachedFuturePrice;
}
string paths[]; string paths[];
int pathCount = 0; int pathCount = 0;
@@ -1041,140 +1042,77 @@ double LoadFuturePriceFromCSV() {
} }
CSVLoadLogged = true; CSVLoadLogged = true;
} }
CachedFuturePrice = 0; return;
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)) { while(!FileIsEnding(filehandle) && (callIndex < 3 || putIndex < 3))
string line = FileReadString(filehandle); {
dataLineCount++; string row = FileReadString(filehandle);
string data[];
int count = StringSplit(row, ',', data);
if(line == "") { if(count >= 3)
inPriceSection = true; {
continue; string type = data[0];
} double strike = StringToDouble(data[1]);
int oi = (int)StringToInteger(data[2]);
if(dataLineCount == 1 && StringGetCharacter(line, 0) == 0xFEFF) { if(StringFind(type, "Future") >= 0)
line = StringSubstr(line, 1); {
if(line == "") { futurePrice = strike;
inPriceSection = true;
continue;
}
}
if(StringFind(line, "Type") >= 0 || StringFind(line, "Strike") >= 0 || StringFind(line, "OI") >= 0) {
continue;
}
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) { if(!CSVLoadLogged) {
Print("DEBUG: Parsed FuturePrice: ", futurePrice); Print("DEBUG: Parsed Future price: ", futurePrice);
} }
} }
continue; else if(type == "CALL" && callIndex < 3)
{
CallLevels[callIndex] = strike;
CallOI[callIndex] = oi;
callIndex++;
} }
else if(type == "PUT" && putIndex < 3)
string parts[]; {
int split = StringSplit(line, ',', parts); PutLevels[putIndex] = strike;
PutOI[putIndex] = oi;
if(split >= 3) { putIndex++;
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); FileClose(filehandle);
if(callCount > 0) { for(int i = callIndex; i < 3; i++)
ArraySort(callStrikes); {
if(callCount >= 1) CSVDynamicCallStrike1 = callStrikes[callCount-1]; CallLevels[i] = 0;
if(callCount >= 2) CSVDynamicCallStrike2 = callStrikes[callCount-2]; CallOI[i] = 0;
if(callCount >= 3) CSVDynamicCallStrike3 = callStrikes[callCount-3];
} }
if(putCount > 0) { for(int i = putIndex; i < 3; i++)
ArraySort(putStrikes); {
if(putCount >= 1) CSVDynamicPutStrike1 = putStrikes[putCount-1]; PutLevels[i] = 0;
if(putCount >= 2) CSVDynamicPutStrike2 = putStrikes[putCount-2]; PutOI[i] = 0;
if(putCount >= 3) CSVDynamicPutStrike3 = putStrikes[putCount-3];
} }
if(futurePrice > 0) { if(futurePrice > 0) {
CachedFuturePrice = futurePrice; CachedFuturePrice = futurePrice;
DynamicFuturePrice = futurePrice;
LoadedCSVPath = foundPath; LoadedCSVPath = foundPath;
CSVStrikesLoaded = true;
if(!CSVLoadLogged) {
Print("CSV SUCCESS: FuturePrice=", futurePrice, ", CALL=[", CSVDynamicCallStrike1, ",", CSVDynamicCallStrike2, ",", CSVDynamicCallStrike3, "], PUT=[", CSVDynamicPutStrike1, ",", CSVDynamicPutStrike2, ",", CSVDynamicPutStrike3, "] loaded from ", foundPath);
CSVLoadLogged = true; 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 { } else {
if(!CSVLoadLogged) { if(!CSVLoadLogged) {
Print("CSV ERROR: No valid price found in ", foundPath); 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; CSVLoadLogged = true;
} }
CachedFuturePrice = 0; 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() { void CheckExistingPositions() {
for(int i = 0; i < PositionsTotal(); i++) { for(int i = 0; i < PositionsTotal(); i++) {
@@ -1440,7 +1378,34 @@ void UpdateInputValues() {
InitializeKeyLevels(); InitializeKeyLevels();
if(InpOISource == OI_SOURCE_CSV_FILE) { if(InpOISource == OI_SOURCE_CSV_FILE) {
LoadFuturePriceFromCSV(); CachedFuturePrice = -1;
ApplyCSVStrikeLevels(); 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();
} }
} }

View File

@@ -304,8 +304,7 @@ def export_to_csv(df, future_price=0.0):
for _, row in put_df.iterrows(): for _, row in put_df.iterrows():
f.write(f"PUT,{row['Strike']:.1f},{row['OI']}\n") f.write(f"PUT,{row['Strike']:.1f},{row['OI']}\n")
f.write("\n[Price]\n") f.write(f"Future,{future_price},0\n")
f.write(f"FuturePrice,{future_price}\n")
logger.info(f"Exported OI data and price to {output_path}") logger.info(f"Exported OI data and price to {output_path}")