• Welcome back! Thank you for being a part of this Traders Community. Let's discuss and share :)
    Selamat datang kembali! Trimakasih telah menjadi bagian dari Komunitas Trader ini. Mari berdiskusi dan berbagi :)

Tanya Jawab MQL

Master Hendro mohon bantuannya, saya coba membuat indikator versi mtf tetapi masih error. Berikut saya sertakan file mq4 nya. Terimakasih banyak atas bantuannya.
Karena kita semua dalam tahap belajar dan bukan untuk memeriksa pekerjaan :) , maka silahkan coding di tulis dalam komen pada forum ini agar semua bisa belajar dari yang lain
Pesan Errornya apa? coba cek dibagian bawah setelah file di compile.
 
Karena kita semua dalam tahap belajar dan bukan untuk memeriksa pekerjaan :) , maka silahkan coding di tulis dalam komen pada forum ini agar semua bisa belajar dari yang lain
Pesan Errornya apa? coba cek dibagian bawah setelah file di compile.
[HASHTAG]#property[/HASHTAG] indicator_separate_window
[HASHTAG]#property[/HASHTAG] indicator_buffers 2
[HASHTAG]#property[/HASHTAG] indicator_color1 Blue
[HASHTAG]#property[/HASHTAG] indicator_color2 Red

//Input Paramete
/*
PERIOD_M1 1
PERIOD_M5 5
PERIOD_M15 15
PERIOD_M30 30
PERIOD_H1 60
PERIOD_H4 240
PERIOD_D1 1440
PERIOD_W1 10080
PERIOD_MN1 43200
*/

extern int TimeFrame = 0;
extern int SSP = 7;
extern double Kmax = 50.6;
extern int CountBars = 300;
double G_ibuf_92[];
double G_ibuf_96[];
double G_ibuf_100[];
double G_ibuf_104[];

int init() {
IndicatorBuffers(4);
SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID, 5);
SetIndexBuffer(0, G_ibuf_100);
SetIndexStyle(1, DRAW_HISTOGRAM, STYLE_SOLID, 5);
SetIndexBuffer(1, G_ibuf_104);
SetIndexBuffer(2, G_ibuf_92);
SetIndexBuffer(3, G_ibuf_96);
switch(TimeFrame)
{
case 1 : string TimeFrameStr="Period_M1";break;
case 5 : string TimeFrameStr="Period_M5";break;
case 15 : string TimeFrameStr="Period_M15";break;
case 30 : string TimeFrameStr="Period_M30";break;
case 60 : string TimeFrameStr="Period_H1";break;
case 240 : string TimeFrameStr="Period_H4";break;
case 1440 : string TimeFrameStr="Period_D1";break;
case 10080 : string TimeFrameStr="Period_W1";break;
case 43200 : string TimeFrameStr="Period_MN1";break;
default: TimeFrameStr="CurrentTimeFrame";
}
IndicatorShortName("SS2009_C MTF("+TimeFrameStr + SSP + ")");
return (0);
}
int deinit() {
return (0);
}

int start() {
datetime TimeArray[];
int i,limit,y=0,counted_bars=IndicatorCounted();
ArrayCopySeries(TimeArray,MODE_TIME,Symbol(),TimeFrame);
limit= Bars-1;
for(i=0,y=0;i<limit;i++)
{
if (Time<TimeArray[y])y++;

double Ld_8;
double Ld_16;
double Ld_32;
if (CountBars >= Bars) CountBars = Bars;
SetIndexDrawBegin(0, Bars - CountBars + SSP);
SetIndexDrawBegin(1, Bars - CountBars + SSP);
int ind_counted_4 = IndicatorCounted();
if (Bars <= SSP + 1) return (0);
if (ind_counted_4 < SSP + 1) {
for (int Li_0 = 1; Li_0 <= SSP; Li_0++) G_ibuf_92[CountBars - Li_0] = 0.0;
for (Li_0 = 1; Li_0 <= SSP; Li_0++) G_ibuf_96[CountBars - Li_0] = 0.0;
}
for (Li_0 = CountBars - SSP; Li_0 >= 0; Li_0--) {
Ld_8 = High[iHighest(NULL, TimeFrame, MODE_HIGH, SSP, Li_0 - SSP + 1)];
Ld_16 = Low[iLowest(NULL, TimeFrame, MODE_LOW, SSP, Li_0 - SSP + 1)];
Ld_32 = Ld_8 - (Ld_8 - Ld_16) * Kmax / 100.0;
G_ibuf_92[Li_0 - SSP + 6] = Ld_32;
G_ibuf_96[Li_0 - SSP - 1] = Ld_32;
}
for (int Li_40 = CountBars - SSP; Li_40 >= 0; Li_40--) {
if (G_ibuf_92[Li_40] > G_ibuf_96[Li_40]) {
G_ibuf_100[Li_40] = 1;
G_ibuf_104[Li_40] = 0;
} else {
G_ibuf_100[Li_40] = 0;
G_ibuf_104[Li_40] = 1;
}
}
}
return (0);
}

Pesan error nya saya sertakan dalam foto master. Terimakasih atas tanggapannya
 

Attachments

  • ScreenShot_20160729174258.png
    ScreenShot_20160729174258.png
    41.5 KB · Views: 23
Kalau diperhatikan pesan error dalam gambar dan juga penulisan coding di atas, maka sudah jelas bahwa variable dari TimeFrameStr sudah pernah di deklarasikan, coba cek pada line dan kolom berapa errornya. Silahkan lihat gambar, Jika sudah pernah dipakai, ganti dengan nama yang berbeda.error.jpg
 
Kalau diperhatikan pesan error dalam gambar dan juga penulisan coding di atas, maka sudah jelas bahwa variable dari TimeFrameStr sudah pernah di deklarasikan, coba cek pada line dan kolom berapa errornya. Silahkan lihat gambar, Jika sudah pernah dipakai, ganti dengan nama yang berbeda.View attachment 23700
Terimakasih atas masukkannya master. Saya coba perbaiki lagi codingnya.
 
Terimakasih atas masukkannya master. Saya coba perbaiki lagi codingnya.
Code:
case 1 : string TimeFrameStr="Period_M1";break;
case 5 : string TimeFrameStr="Period_M5";break;
case 15 : string TimeFrameStr="Period_M15";break;
case 30 : string TimeFrameStr="Period_M30";break;
case 60 : string TimeFrameStr="Period_H1";break;
case 240 : string TimeFrameStr="Period_H4";break;
case 1440 : string TimeFrameStr="Period_D1";break;
case 10080 : string TimeFrameStr="Period_W1";break;
case 43200 : string TimeFrameStr="Period_MN1";break;

TimeFrameStr cukup di dibuat di global variable aja. ga perlu di ulang2
 
Misi suhu2, master2. saya mau tanya.

Jika saya mempunyai 5 OP dan saya ingin mengetahui Order Open Price dari masing2 OP bagaimana caranya ya?
kemampuan saya hanya sebatas mengkombinasikan loop dengan OrderSelect yang menghasilkan OrderOpenPrice dari OP terakhir..
 
Misi suhu2, master2. saya mau tanya.

Jika saya mempunyai 5 OP dan saya ingin mengetahui Order Open Price dari masing2 OP bagaimana caranya ya?
kemampuan saya hanya sebatas mengkombinasikan loop dengan OrderSelect yang menghasilkan OrderOpenPrice dari OP terakhir..
Gunakan operator for untuk looping dari order yang ada, setelah itu order di pilih dengan menggunakan perintah order select, dalam memilih ini bisa kita kembangkan banyak hal, Misalnya memilih harga open price, besarnya lot atau profitnya.
Contoh sederhana;
Code:
int tiket; double OOP;
// operator for untuk looping 
for (int i = OrdersTotal()-1; i >=0 ; i--)
  {// memilih posisi order yang aktif
      if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES) continue;
     tiket=OrderTicket();
      OOP=OrderOpenPrice();
if(tiket>0) break;// EA akan selalu memilih harga terakir
}// end looping
Comment (OOP);// untuk tes apakah benar Order Open Price terakir


Master HendroFX , gimana coding buat tau harga sekarang yang sedang running ...?
Sangat mudah gunakan coding dibawah ini; untuk simbol bisa diganti ganti sesuai PAIR yang di inginkan, jika menggunakan Symbol(), maka yang dimaksud adalah simbol dimana EA sedang Running.
Code:
 double HargaSekarang;
HargaSekarang=MarketInfo(Symbol(),MODE_ASK):
Comment (HargaSekarang);// Lihat Comment pada layar harga sekarang
 
Gunakan operator for untuk looping dari order yang ada, setelah itu order di pilih dengan menggunakan perintah order select, dalam memilih ini bisa kita kembangkan banyak hal, Misalnya memilih harga open price, besarnya lot atau profitnya.
Contoh sederhana;
Code:
int tiket; double OOP;
// operator for untuk looping
for (int i = OrdersTotal()-1; i >=0 ; i--)
  {// memilih posisi order yang aktif
      if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES) continue;
     tiket=OrderTicket();
      OOP=OrderOpenPrice();
if(tiket>0) break;// EA akan selalu memilih harga terakir
}// end looping
Comment (OOP);// untuk tes apakah benar Order Open Price terakir



Sangat mudah gunakan coding dibawah ini; untuk simbol bisa diganti ganti sesuai PAIR yang di inginkan, jika menggunakan Symbol(), maka yang dimaksud adalah simbol dimana EA sedang Running.
Code:
 double HargaSekarang;
HargaSekarang=MarketInfo(Symbol(),MODE_ASK):
Comment (HargaSekarang);// Lihat Comment pada layar harga sekarang
klo saya ingin menampilkan semua hasil dri order select gmn?
klo
for (int i ==0; i<4; i++)
Alert(i);

hasilnya 0,1,2,3.
nah klo capture dari Order Select gmn?
 
Bisa dijelaskan lebih detail dari pertanyaanya?
misal gini.. saya ada 4 order.. tiap order pasti punya OrderOpenPrice masing2.
saya ingin bisa capture nilai tiap OrderOpenPrice.
klo saya pake fungsi For()
yang terbaca hanya Order Terakhir.
for (int i; i<OrdersTotal; i++)
{ double order=0;
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)
............................................
Order=OrderOpenPrice();
}
 
misal gini.. saya ada 4 order.. tiap order pasti punya OrderOpenPrice masing2.
saya ingin bisa capture nilai tiap OrderOpenPrice.
klo saya pake fungsi For()
yang terbaca hanya Order Terakhir.
for (int i; i<OrdersTotal; i++)
{ double order=0;
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)
............................................
Order=OrderOpenPrice();
}
Jelas berbeda cara pengambilan data open ordernya, hal itu menggunakan Array size, nah untuk ynag ini silahkan dipelajari tentang Array size ya..
 
Menulis file hitory dalam folder file dalam MT4, dengan format seperti ini
Code:
uint FileWrite(
intfile_handle, // File handle
... // List of recorded parameters
   );

CONTOH Aplikasi dalam penulisan codingnya :)
Code:
#propertycopyright"Copyright 2014, MetaQuotes Software Corp."
#propertylink"https://www.mql5.com"
#propertyversion"1.00"
#propertystrict
//--- show the window of input parameters when launching the script
#propertyscript_show_inputs
//--- parameters for receiving data from the terminal
inputstring InpSymbolName="EURUSD"; // Сurrency pair
inputENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_H1; // Time frame
inputint InpFastEMAPeriod=12; // Fast EMA period
inputint InpSlowEMAPeriod=26; // Slow EMA period
inputint InpSignalPeriod=9; // Difference averaging period
inputENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Price type
//--- parameters for writing data to file
inputstring InpFileName="MACD.csv"; // File name
inputstring InpDirectoryName="Data"; // Folder name
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
voidOnStart()
{
bool sign_buff[]; // signal array (true - buy, false - sell)
datetime time_buff[]; // array of signals' appear time
int sign_size=0; // signal array size
double macd_buff[]; // array of indicator values
datetime date_buff[]; // array of indicator dates
int macd_size=0; // size of indicator arrays
//--- set indexing as time series
ArraySetAsSeries(sign_buff,true);
ArraySetAsSeries(time_buff,true);
ArraySetAsSeries(macd_buff,true);
ArraySetAsSeries(date_buff,true);
//--- reset last error code
ResetLastError();
//--- copying the time from last 1000 bars
int copied=CopyTime(NULL,0,0,1000,date_buff);
if(copied<=0)
{
PrintFormat("Failed to copy time values. Error code = %d",GetLastError());
return;
}
//--- prepare macd_buff array
ArrayResize(macd_buff,copied);
//--- copy the values of main line of the iMACD indicator
for(int i=0;i<copied;i++)
{
macd_buff[i]=iMACD(InpSymbolName,InpSymbolPeriod,InpFastEMAPeriod,InpSlowEMAPeriod,InpSignalPeriod,InpAppliedPrice,MODE_MAIN,i);
}
//--- get size
macd_size=ArraySize(macd_buff);
//--- analyze the data and save the indicator signals to the arrays
ArrayResize(sign_buff,macd_size-1);
ArrayResize(time_buff,macd_size-1);
for(int i=1;i<macd_size;i++)
{
//--- buy signal
if(macd_buff[i-1]<0 && macd_buff[i]>=0)
{
sign_buff[sign_size]=true;
time_buff[sign_size]=date_buff[i];
sign_size++;
}
//--- sell signal
if(macd_buff[i-1]>0 && macd_buff[i]<=0)
{
sign_buff[sign_size]=false;
time_buff[sign_size]=date_buff[i];
sign_size++;
}
}
//--- open the file for writing the indicator values (if the file is absent, it will be created automatically)
ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_CSV);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("%s file is available for writing",InpFileName);
PrintFormat("File path: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- first, write the number of signals
FileWrite(file_handle,sign_size);
//--- write the time and values of signals to the file
for(int i=0;i<sign_size;i++)
FileWrite(file_handle,time_buff[i],sign_buff[i]);
//--- close the file
FileClose(file_handle);
PrintFormat("Data is written, %s file is closed",InpFileName);
}
else
PrintFormat("Failed to open %s file, Error code = %d",InpFileName,GetLastError());
}
kalau save di terminal data path sih memang sudah bisa om hendro...
masalahnya ini kok g bisa di save langsung save ke dekstop ya..?
apakah ada pencerahan lainnya om..?
 
Sangat mudah gunakan coding dibawah ini; untuk simbol bisa diganti ganti sesuai PAIR yang di inginkan, jika menggunakan Symbol(), maka yang dimaksud adalah simbol dimana EA sedang Running.
Code:
double HargaSekarang;
HargaSekarang=MarketInfo(Symbol(),MODE_ASK):
Comment (HargaSekarang);// Lihat Comment pada layar harga sekarang

Tanya lagi master HendroFX
kalau buat mengetahui Open Close Candle jam 23:00 dari broker coding nya bagaimna master ?
 
kalau save di terminal data path sih memang sudah bisa om hendro...
masalahnya ini kok g bisa di save langsung save ke dekstop ya..?
apakah ada pencerahan lainnya om..?
Penyimpanan data file memang pada terminal data, dan saya kira tidak ada masalah dengan hal itu

Tanya lagi master HendroFX
kalau buat mengetahui Open Close Candle jam 23:00 dari broker coding nya bagaimna master ?

Pertma cari dulu candel ke berapa Jam 23 tersebut dengan melakukan looping pada candle yang sudah berjalan (gunakan operator for)
Ke dua, Jika sudah ketemu baru mencari Harga Open order dan "Close"nya,
contoh sederhana sebagai basic yang bisa dikembangkan
Code:
datetime TimeBar; int Bar;
 double HdOpen,HdClose;  
 for(Bar=0; Bar<Bars; Bar++)
 {  
      TimeBar= iTime(Symbol(),0,Bar) ;    
     if(TimeHour(TimeBar)!=23)continue;
      if(TimeHour(TimeBar)==23)break;
}    
HdOpen =iOpen(Symbol(),0,Bar);
HdClose= iClose(Symbol(),0,Bar);  
Alert("Open Order Candle Jam 23 = "+ HdOpen );
 
Pertma cari dulu candel ke berapa Jam 23 tersebut dengan melakukan looping pada candle yang sudah berjalan (gunakan operator for)
Ke dua, Jika sudah ketemu baru mencari Harga Open order dan "Close"nya,
contoh sederhana sebagai basic yang bisa dikembangkan
Code:
datetime TimeBar; int Bar;
double HdOpen,HdClose; 
for(Bar=0; Bar<Bars; Bar++)
{ 
      TimeBar= iTime(Symbol(),0,Bar) ;   
     if(TimeHour(TimeBar)!=23)continue;
      if(TimeHour(TimeBar)==23)break;
}   
HdOpen =iOpen(Symbol(),0,Bar);
HdClose= iClose(Symbol(),0,Bar); 
Alert("Open Order Candle Jam 23 = "+ HdOpen );
[/QUOTE]

Maap master tanya terus .... Tapi kalao gak tanya pusing sendiri ...
Biar HdClose nya bisa jadi SL gimana code nya master HendroFX ?, terus biar EA nya bisa OP setiap 1 jam code nya bagaimana ?
 
Pertma cari dulu candel ke berapa Jam 23 tersebut dengan melakukan looping pada candle yang sudah berjalan (gunakan operator for)
Ke dua, Jika sudah ketemu baru mencari Harga Open order dan "Close"nya,
contoh sederhana sebagai basic yang bisa dikembangkan
Code:
datetime TimeBar; int Bar;
double HdOpen,HdClose;
for(Bar=0; Bar<Bars; Bar++)
{
      TimeBar= iTime(Symbol(),0,Bar) ; 
     if(TimeHour(TimeBar)!=23)continue;
      if(TimeHour(TimeBar)==23)break;
} 
HdOpen =iOpen(Symbol(),0,Bar);
HdClose= iClose(Symbol(),0,Bar);
Alert("Open Order Candle Jam 23 = "+ HdOpen );

Maap master tanya terus .... Tapi kalao gak tanya pusing sendiri ...
Biar HdClose nya bisa jadi SL gimana code nya master HendroFX ?, terus biar EA nya bisa OP setiap 1 jam code nya bagaimana ?

Mas bertanya karena mas belum mengerti dasar dari dasar Mql, saran saya pelajari Mqlnya, jika tidak tidak akan pernah bisa menguasai tingkat yang lebih tinggi
 
Mas bertanya karena mas belum mengerti dasar dari dasar Mql, saran saya pelajari Mqlnya, jika tidak tidak akan pernah bisa menguasai tingkat yang lebih tinggi

Sebenernya sudah master, berhubung belajar nya otodidak, jadi kalau ada kesulitan mentok .....
Udah searching tapi belum dapet... Btw thanks master HendroFX , atas sarannya ....
 
Sebenernya sudah master, berhubung belajar nya otodidak, jadi kalau ada kesulitan mentok .....
Udah searching tapi belum dapet... Btw thanks master HendroFX , atas sarannya ....
code yang di kasih di atas adalah untuk capture nilai Close dan Open Candle pada H 23.
coba value HdOpen dan HdClose di panggil pake Alert.. udah sesuai blm.
tinggal nanti di manfaatkan. bisa sebagai acuan OP
 
Back
Top