Gimana…..sudah ga sabar yah menunggu hasil projek ML ini ? 😀 Sabar yah…..tunggu nanti Part#4 yah…karena ujicobanya belum selesai….hahaha :D. Tapi ada bocoran sedikit nih. Dari hasil ujicoba hingga saat ini, bisa dibilang…hmmm…..So far, So good. 🙂 🙂
OK, jadi pada artikel ini saya mau berbagi tentang [belajar] pemrograman atau coding dengan Python untuk Server side dari Machine Learning. Khan biar selaras dengan judul artikelnya…. 🙂
Kita mulai dari membuat Class Socket Server .
class socketserver:
def __init__(self, address = '', port = 9999):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.address = address
self.port = port
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.bind((self.address, self.port))
self.cummdata = ''
def recvmsg(self):
self.sock.listen(1)
self.conn, self.addr = self.sock.accept()
print('connected to', self.addr)
self.cummdata = ''
while True:
data = self.conn.recv(10000000)
self.cummdata+=data.decode("utf-8")
if not data:
break
self.conn.send(bytes(train_test_model(self.cummdata), "utf-8"))
return self.cummdata
def __del__(self):
self.sock.close()
Berikutnya, untuk setiap Model yang akan kita kembangkan, kita akan buat masing-masing sebuah prosedur atau fungsi atau sub-program. Tujuannya agar mudah untuk proses debug dan pengembangan lebih lanjut. Jadi, misal pada projek ini kita akan menggunakan 5 model, maka masing-masing model kita akan buat fungsinya. Sebagai contoh, berikut ini adalah fungsi Training menggunakan Random Forest model.
def train_RF(training_set, trainSize, n_feature):
if(type(training_set) == list):
print("---------------------------------------------------------------")
print("TRAINING with RANDOM FOREST is started...")
print("Load training data...")
df = pd.read_csv('./datasets/gen/OHLC_Features.csv', index_col=0, parse_dates=True, skipinitialspace=True)
x = df.iloc[:,0:(n_feature)]
y = df['TargetNextClose']
### Splitting Data
x_train = x[:trainSize]
x_test= x[trainSize:]
y_train = y[:trainSize]
y_test = y[trainSize:]
### Scaling
scale = MinMaxScaler(feature_range=(0,1))
x_train = scale.fit_transform(x_train)
x_test = scale.transform(x_test)
### Train
model = RandomForestRegressor(n_estimators=50, random_state=30, min_samples_split=2, min_samples_leaf=1, max_depth=15, bootstrap=True)
### Fit & Predict
model.fit(x_train, y_train)
predict_rf = model.predict(x_test)
### Evaluate
MAE_RF = round(metrics.mean_absolute_error(y_test, predict_rf), 4)
print("Mean Absolute Error:", MAE_RF)
MSE_RF = round(metrics.mean_squared_error(y_test, predict_rf), 4)
print("Mean Squared Error:", MSE_RF)
RMSE = round(np.sqrt(metrics.mean_squared_error(y_test, predict_rf)), 4)
print("Root Mean Squared Error:", RMSE)
R2Score = round(metrics.r2_score(y_test, predict_rf), 4)
print("(R^2) Score:", R2Score)
print(f'Train Score : {model.score(x_train, y_train) * 100:.2f}% and Test Score : {model.score(x_test, y_test) * 100:.2f}%.')
errors = abs(predict_rf - y_test)
mape_rf = 100 * (errors / y_test)
accuracy_rf = 100 - np.mean(mape_rf)
print('Accuracy RF :', round(accuracy_rf, 2), '%.')
return predict_rf, MSE_RF, MAE_RF, accuracy_rf
Jadi pada projek ini kita akan membuat fungsi beberapa model regressor. Kenapa? Yah, untuk mengetahui performa atau kinerja suatu model, tentunya kita perlu lebih dari satu model sebagai pembanding. Sehingga kita bisa mengetahui mana model yang memiliki kinerja dan akurasi prediksi yang optimal. Adapun untuk model regressor yang lain, seperti LSTM dan SARIMAX, serta Hybrid, silahkan Anda kembangkan sendiri yah…. 😀 😀 Saya sudah berikan contoh dengan model regressor Random Forest.
Fungsi berikutnya yang bisa dkatakan fitur penting dalam projek ini adalah pendeteksi bearish/bullish candlestick.
def candlestick_pattern():
print("--------------------------------------------------------------")
print("Candlestick Pattern detection is started")
##Load new dataset with OHLC
candles_df = pd.read_csv('./datasets/gen/_OHLC.csv', index_col=0)
#### Find BEARISH
target_bearish = 'BearishEngulfing'
candles_df_bearish = candlestick.bearish_engulfing(candles_df.iloc[-30:], target=target_bearish)
print(candles_df_bearish[candles_df_bearish[target_bearish] == True][[target_bearish]])
time_df_bearish = candles_df_bearish[candles_df_bearish[target_bearish]== True]['Date'].values
time_df_bearish = np.array([time_df_bearish], dtype='datetime64')
if target_bearish:
signal_BB = 'Bearish'
return signal_BB
else:
print("NO BEARISH engulfing candlestick")
### Find BULLISH
target_bullish = 'BullishEngulfing'
candles_df_bullish = candlestick.bullish_engulfing(candles_df.iloc[-30:], target=target_bullish)
time_df_bullish = candles_df_bullish[candles_df_bullish[target_bullish]== True]['Date'].values
time_df_bullish = np.array([time_df_bullish], dtype='datetime64')
if target_bullish:
signal_BB = 'Bullish'
return signal_BB
else:
print("NO BULLISH engulfing candlestick.")
OK, itu tadi adalah bagian dari Server Side. Sekarang kita [belajar] membuat program untuk Client Side. Kali ini kita akan menggunakan bahasa MQL4 untuk Metatrader. Dan kalau kita menginstal Metatrader, kita disediakan tools untuk membuat program MQL4, yaitu MetaEditor.
void OnTick()
{
if (isnewcandle())
{
if(onRetrainBar()){
if(!socket){
socket = new ClientSocket(server,port);
if (socket.IsSocketConnected()){
Print("Client connection succeeded");
}
else{
Print("Client connection failed");
Print("Please check all connection");
delete socket;
socket = NULL;
return;
}
Print("Connected to Machine Learning at ",server,":",port);
//----Preparing data to be sent to Machine Learning via socket
datetime time[]; //--Datetime
int copyTime = CopyTime(_Symbol,PERIOD_CURRENT,0,retrain,time);
double oppr[]; //--Open price
int copyOPP = CopyOpen(ChartSymbol(ChartID()),ChartPeriod(ChartID()),0,retrain,oppr);
double hipr[]; //--High Price
int copyHP = CopyHigh(ChartSymbol(ChartID()),ChartPeriod(ChartID()),0,retrain,hipr);
double lopr[]; //--Low Price
int copyLP = CopyLow(ChartSymbol(ChartID()),ChartPeriod(ChartID()),0,retrain,lopr);
double clpr[]; //--Close Price
int copyed = CopyClose(ChartSymbol(ChartID()),ChartPeriod(ChartID()),0,retrain,clpr);
//--Preparing json message
CJAVal json;
for (int i = 0; i < ArraySize(clpr); i++)
{
json["Time"].Add((string)time[i]);
//--OHLC data
json["Open"].Add(DoubleToString(oppr[i],6));
json["High"].Add(DoubleToString(hipr[i],6));
json["Low"].Add(DoubleToString(lopr[i],6));
json["Close"].Add(DoubleToString(clpr[i], 6));
}
string jsonString = json.Serialize();
if(socket.Send(jsonString)){
Print("Data sent successfully to Machine Learning for RETRAIN phase.");
}
}
else{
Print("Sorry......Socket or Machine Learning is Busy!!!");
Print("Please try again later, OK ! ");
}
} // end of retrain bar
} // end isnewcandle()
} // end of on tick
Seperti teman-teman lihat pada script MQL4 Client Side di atas, kita menyalin data harga OHLC (Open-High-Low-Close) dan dikemas ke dalam format JSON lalu dikirim ke Server melalui socket.
Voila !!! Itulah gambaran singkat [belajar] pemrograman menggunakan Python dan MQL4 pada projek ini.
Saya yakin, teman-teman masih banyak hal yang kurang jelas pada projek ini…..hahaha 😀 :D. Yah, itu memang karena keterbatasan saya dalam memberikan detil. Tapi silahkan tinggalkan jejak di bawah pada kolom komentar atau kontak saya langsung. Kita bisa diskusi chit-chat sambil ngu-ber (*ngupi se-ember) 😀 :D.
Tunggu Part#4 yah untuk hasil ujicoba projek ini. 🙂
Colmar, 6/05/2023, Springtime