#property description "Alım-satım istekleri göndermek için bir Uzman Danışman "
" alım-satım istekleri göndermek için bir Uzman Danışman.\r\n"
#property description "OnTrade() ve OnTradeTransaction() fonksiyonlarıyla"
" alım-satım olaylarının işlenmesi göstergilmiştir.\r\n"
#property description "Uzman Danışman parametreleri, Magic Number değerinin "
" ayarlanmasını ve mesajların Uzmanlar günlüğünde "
#property description "görüntülenmesini sağlar. Versayılan olarak tüm detaylar. görüntülenir.\r\n"
//--- giriş parametreleri
input int MagicNumber=1234567; // Uzman Danışman kimliği
input bool DescriptionModeFull=true; // Detaylandırılmış çıktı modu
//--- HistorySelect() çağrısında kullanmak için değişkenler
datetime history_start;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- otomatik alım-satıma izin veriliyor mu kontrol et
if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
{
Alert("Otomatik alım-satım devre dışı, Uzman Danışman silinecek");
ExpertRemove();
return(-1);
}
//--- gerçek hesapta alım-satım yapılamıyor
if(AccountInfoInteger(ACCOUNT_TRADE_MODE)==ACCOUNT_TRADE_MODE_REAL)
{
Alert("Uzman danışman gerçek hesapta alım-sayım yapamaz!");
ExpertRemove();
return(-2);
}
//--- Bu hesapta alım-satım yapılabilir mi öğren (örneğin, yatırımcı şifresi kullanırken alım-satım imkansız)
if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
{
Alert("Bu hesapta alım-satım devre dışı bırakılmış");
ExpertRemove();
return(-3);
}
//--- Uzman Danışmanı çalıştırmak için gereken zamanı alım-satım geçmişini almak için kullan
history_start=TimeCurrent();
//---
CreateBuySellButtons();
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- tüm grafiksel nesneleri sil
ObjectDelete(0,"Buy");
ObjectDelete(0,"Sell");
//---
}
//+------------------------------------------------------------------+
//| TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
//--- alım-satım olayının işleyicisinin ismine göre bir başlık
Print("=> ",__FUNCTION__," zaman: ",TimeToString(TimeCurrent(),TIME_SECONDS));
//--- faaliyet tipini, sayım değeri olarak al
ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- eğer faaliyet, isteğin işlenmesinin bir sonucu ise
if(type==TRADE_TRANSACTION_REQUEST)
{
//--- faaliyet ismini görüntüle
Print(EnumToString(type));
//--- işlenen isteğin metin şeklindeki açıklamasını görüntüle
Print("------------RequestDescription\r\n",
RequestDescription(request,DescriptionModeFull));
//--- ve istek sonucunun açıklamasını göster
Print("------------ ResultDescription\r\n",
TradeResultDescription(result,DescriptionModeFull));
}
else // diğer tipteki faaliyetler için, bu faaliyetin tam açıklamasını görüntüle
{
Print("------------ TransactionDescription\r\n",
TransactionDescription(trans,DescriptionModeFull));
}
//---
}
//+------------------------------------------------------------------+
//| Trade function |
//+------------------------------------------------------------------+
void OnTrade()
{
//--- hesap durumunu saklamak için statik değişkenler
static int prev_positions=0,prev_orders=0,prev_deals=0,prev_history_orders=0;
//--- alım-satım geçmişini iste
bool update=HistorySelect(history_start,TimeCurrent());
PrintFormat("HistorySelect(%s , %s) = %s",
TimeToString(history_start),TimeToString(TimeCurrent()),(string)update);
//--- alım-satım olayının işleyicisinin ismine göre bir başlık
Print("=> ",__FUNCTION__," zaman: ",TimeToString(TimeCurrent(),TIME_SECONDS));
//--- işleyici ismini ve işleme anındaki emir sayısını görüntüle
int curr_positions=PositionsTotal();
int curr_orders=OrdersTotal();
int curr_deals=HistoryOrdersTotal();
int curr_history_orders=HistoryDealsTotal();
//--- emirlerin, pozisyonların, işlemlerin ve değişimlerin (parantez içinde) sayısını görüntüle
PrintFormat("PositionsTotal() = %d (%+d)",
curr_positions,(curr_positions-prev_positions));
PrintFormat("OrdersTotal() = %d (%+d)",
curr_orders,curr_orders-prev_orders);
PrintFormat("HistoryOrdersTotal() = %d (%+d)",
curr_deals,curr_deals-prev_deals);
PrintFormat("HistoryDealsTotal() = %d (%+d)",
curr_history_orders,curr_history_orders-prev_history_orders);
//--- günlüğü daha uygun şekilde görebilmek için dizgi ayırma karakteri ekle
Print("");
//--- hesap durumunu sakla
prev_positions=curr_positions;
prev_orders=curr_orders;
prev_deals=curr_deals;
prev_history_orders=curr_history_orders;
//---
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//--- CHARTEVENT_CLICK olayının ("Çizelge üzerinde tıklama") işlenmesi
if(id==CHARTEVENT_OBJECT_CLICK)
{
Print("=> ",__FUNCTION__,": sparam = ",sparam);
//--- minimum işlem hacmi
double volume_min=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
//--- "Buy" basılı ise satın al
if(sparam=="Buy")
{
PrintFormat("Al %s %G lot",_Symbol,volume_min);
BuyAsync(volume_min);
//--- düğmeyi serbest bırak
ObjectSetInteger(0,"Buy",OBJPROP_STATE,false);
}
//--- "Sell" düğmesi basılı ise sat
if(sparam=="Sell")
{
PrintFormat("Sat %s %G lot",_Symbol,volume_min);
SellAsync(volume_min);
//--- düğmeyi serbest bırak
ObjectSetInteger(0,"Sell",OBJPROP_STATE,false);
}
ChartRedraw();
}
//---
}
//+------------------------------------------------------------------+
//| Bir faaliyetin metin açıklamasına dönüş yapar |
//+------------------------------------------------------------------+
string TransactionDescription(const MqlTradeTransaction &trans,
const bool detailed=true)
{
//--- Fonksiyonun dönüş yapacağı dizgiyi hazırla
string desc=EnumToString(trans.type)+"\r\n";
//--- ayrıntılı modda, mümkün olan tüm veriler eklenir
if(detailed)
{
desc+="Sembol: "+trans.symbol+"\r\n";
desc+="İşlem fişi: "+(string)trans.deal+"\r\n";
desc+="İşlem tipi: "+EnumToString(trans.deal_type)+"\r\n";
desc+="Emir fişi: "+(string)trans.order+"\r\n";
desc+="Emir tipi: "+EnumToString(trans.order_type)+"\r\n";
desc+="Emir durumu: "+EnumToString(trans.order_state)+"\r\n";
desc+="Emir zaman tipi: "+EnumToString(trans.time_type)+"\r\n";
desc+="Emir zaman aşımı tipi: "+TimeToString(trans.time_expiration)+"\r\n";
desc+="Fiyat: "+StringFormat("%G",trans.price)+"\r\n";
desc+="Fiyat eşiği: "+StringFormat("%G",trans.price_trigger)+"\r\n";
desc+="Stop Loss: "+StringFormat("%G",trans.price_sl)+"\r\n";
desc+="Take Profit: "+StringFormat("%G",trans.price_tp)+"\r\n";
desc+="Hacim: "+StringFormat("%G",trans.volume)+"\r\n";
}
//--- alınan dizgiye dönüş yap
return desc;
}
//+------------------------------------------------------------------+
//| Bir alım-satım isteğinin metin açıklamasına dönüş yapar |
//+------------------------------------------------------------------+
string RequestDescription(const MqlTradeRequest &request,
const bool detailed=true)
{
//--- Fonksiyonun dönüş yapacağı dizgiyi hazırla
string desc=EnumToString(request.action)+"\r\n";
//--- mevcut olan tüm verileri ayrıntılı modda ekle
if(detailed)
{
desc+="Sembol: "+request.symbol+"\r\n";
desc+="Magic Number (sihirli sayı): "+StringFormat("%d",request.magic)+"\r\n";
desc+="Emir fişi: "+(string)request.order+"\r\n";
desc+="Emir tipi: "+EnumToString(request.type)+"\r\n";
desc+="Emrin karşılanma: "+EnumToString(request.type_filling)+"\r\n";
desc+="Emir zaman tipi: "+EnumToString(request.type_time)+"\r\n";
desc+="Emir zaman aşımı tipi: "+TimeToString(request.expiration)+"\r\n";
desc+="Fiyat: "+StringFormat("%G",request.price)+"\r\n";
desc+="Sapma noktaları: "+StringFormat("%G",request.deviation)+"\r\n";
desc+="Stop Loss: "+StringFormat("%G",request.sl)+"\r\n";
desc+="Take Profit: "+StringFormat("%G",request.tp)+"\r\n";
desc+="Stop Limit: "+StringFormat("%G",request.stoplimit)+"\r\n";
desc+="Hacim: "+StringFormat("%G",request.volume)+"\r\n";
desc+="Yorum: "+request.comment+"\r\n";
}
//--- alınan dizgiye dönüş yap
return desc;
}
//+------------------------------------------------------------------+
//| İstek işleme sonucunun metin açıklamasına dönüş yapar |
//+------------------------------------------------------------------+
string TradeResultDescription(const MqlTradeResult &result,
const bool detailed=true)
{
//--- fonksiyonun dönüş yapacağı dizgiyi hazırla
string desc="Retcode "+(string)result.retcode+"\r\n";
//--- mevcut olan tüm verileri ayrıntılı modda ekle
if(detailed)
{
desc+="İstek kimliği: "+StringFormat("%d",result.request_id)+"\r\n";
desc+="Emir fişi: "+(string)result.order+"\r\n";
desc+="İşlem fişi: "+(string)result.deal+"\r\n";
desc+="Hacim: "+StringFormat("%G",result.volume)+"\r\n";
desc+="Fiyat: "+StringFormat("%G",result.price)+"\r\n";
desc+="Ask: "+StringFormat("%G",result.ask)+"\r\n";
desc+="Bid: "+StringFormat("%G",result.bid)+"\r\n";
desc+="Yorum: "+result.comment+"\r\n";
}
//--- alınan dizgiye dönüş yap
return desc;
}
//+------------------------------------------------------------------+
//| Alım ve Satım için iki düğme oluştur |
//+------------------------------------------------------------------+
void CreateBuySellButtons()
{
//--- "Buy" isimli nesneyi kontrol et
if(ObjectFind(0,"Buy")>=0)
{
//--- bulunan nesne bir düğme değilse sil
if(ObjectGetInteger(0,"Buy",OBJPROP_TYPE)!=OBJ_BUTTON)
ObjectDelete(0,"Buy");
}
else
ObjectCreate(0,"Buy",OBJ_BUTTON,0,0,0); // "Buy" düğmesini oluştur
//--- "Buy" düğmesini şekillendir
ObjectSetInteger(0,"Buy",OBJPROP_CORNER,CORNER_RIGHT_UPPER);
ObjectSetInteger(0,"Buy",OBJPROP_XDISTANCE,100);
ObjectSetInteger(0,"Buy",OBJPROP_YDISTANCE,50);
ObjectSetInteger(0,"Buy",OBJPROP_XSIZE,70);
ObjectSetInteger(0,"Buy",OBJPROP_YSIZE,30);
ObjectSetString(0,"Buy",OBJPROP_TEXT,"Buy");
ObjectSetInteger(0,"Buy",OBJPROP_COLOR,clrRed);
//--- "Sell" isimli nesnenin varlığını kontrol et
if(ObjectFind(0,"Sell")>=0)
{
//--- bulunan nesne bir düğme değilse sil
if(ObjectGetInteger(0,"Sell",OBJPROP_TYPE)!=OBJ_BUTTON)
ObjectDelete(0,"Sell");
}
else
ObjectCreate(0,up_arrow,OBJ_ARROW,0,0,0,0,0); // Bir ok oluştur
//--- "Buy" düğmesini şekillendir
ObjectSetInteger(0,"Sell",OBJPROP_CORNER,CORNER_RIGHT_UPPER);
ObjectSetInteger(0,"Sell",OBJPROP_XDISTANCE,100);
ObjectSetInteger(0,"Sell",OBJPROP_YDISTANCE,100);
ObjectSetInteger(0,"Sell",OBJPROP_XSIZE,70);
ObjectSetInteger(0,"Sell",OBJPROP_YSIZE,30);
ObjectSetString(0,"Sell",OBJPROP_TEXT,"Sell");
ObjectSetInteger(0,"Sell",OBJPROP_COLOR,clrBlue);
//--- düğmeleri hemen görebilmek için çizelgeyi zorla güncele
ChartRedraw();
//---
}
//+------------------------------------------------------------------+
//| OrderSendAsync() fonksiyonunu kullanarak al |
//+------------------------------------------------------------------+
void BuyAsync(double volume)
{
//--- isteği hazırla
MqlTradeRequest req={};
req.action =TRADE_ACTION_DEAL;
req.symbol =_Symbol;
req.magic =MagicNumber;
req.volume =0.1;
req.type =ORDER_TYPE_BUY;
req.price =SymbolInfoDouble(req.symbol,SYMBOL_ASK);
req.deviation =10;
req.comment ="OrderSendAsync() kullanarak Alış";
MqlTradeResult res={};
if(!OrderSendAsync(req,res))
{
Print(__FUNCTION__,": hata ",GetLastError(),", retcode = ",res.retcode);
}
//---
}
//+------------------------------------------------------------------+
//| OrderSendAsync() fonksiyonunu kullanarak sat |
//+------------------------------------------------------------------+
void SellAsync(double volume)
{
//--- isteği hazırla
MqlTradeRequest req={};
req.action =TRADE_ACTION_DEAL;
req.symbol =_Symbol;
req.magic =MagicNumber;
req.volume =0.1;
req.type =ORDER_TYPE_SELL;
req.price =SymbolInfoDouble(req.symbol,SYMBOL_BID);
req.deviation =10;
req.comment ="OrderSendAsync() kullanarak Satış";
MqlTradeResult res={};
if(!OrderSendAsync(req,res))
{
Print(__FUNCTION__,": hata ",GetLastError(),", retcode = ",res.retcode);
}
//---
}
//+------------------------------------------------------------------+
|