Orders Execution
Miscellaneous
0
Views
0
Downloads
0
Favorites
16_ZigAndZag_trade_V2
//+------------------------------------------------------------------+
//| ZigAndZag_trader.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
#include <stdlib.mqh>
//---- input parameters
extern double Lots=0.1;//òîðãóåìûé ëîò
extern int ZZbar=1;//áàðîâ íàçàä ñ êîòîðîãî áåðåì ñèãíàë ê òîðãîâëå
extern int Closebar=3;//áàðîâ íàçàä ñ êîòîðîãî áåðåì ñèãíàë ê çàêðûòèþ
extern int CloseBars=5;//çàïðåò çàêðûòèÿ íà êîë-âî áàðîâ ñ ìîìåíòà îòêð îðäåðà
extern int Maxord=10;//êîëè÷åñòâî òîðãóåìûõ îðäåðîâ(ïîêà îñòàâèòü 1)âîìîæíî áóäåò ìóëüòèîðäåðíàÿ ñèñòåìà
extern int Sl=0;//ñòîïëîñ ïîäáèðàåòñÿ ïðè îïòèìèçàöèè
extern int Tp=0;//òåéê ïîäáèðàåòñÿ ïðè îïòèìèçàöèè
extern int bu=0;//
extern int Rew=0;//ðåâåðñ ïîçèöèé
extern int ClosePos=1;//Ðàçðåøàåò çàêðûòèå ïîçèöèé ïî ñèãíàëó èíäèêàòîðà
extern bool Drive=false;
extern bool _Bu=false;
extern bool Autolot=true;//âêëþ÷åíèå - îòêëþ÷åíèå àâòîëîòà
extern int magic=78977;//ìàãèê
//-----------------------
static int prevtime = 0 ;
bool buy,sell,close,NumberOfTry=3,UseSound=false;
bool first=true,newday=true;
double MinLot, MaxLot, MarginMinLot;
int MinLotDgts,Slippage=3,period,GrossPeriod,GrossTrand=0;
string NameFileSound = "expert.wav"; // Íàèìåíîâàíèå çâóêîâîãî ôàéëà
color clOpenBuy = Blue; // Öâåò çíà÷êà îòêðûòèÿ Buy
color clOpenSell = Red; // Öâåò çíà÷êà îòêðûòèÿ Sell
bool MarketWatch=true;
bool gbDisabled = False; // Áëîêèðîâêà
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void FirstCalc()
{
//
// Ïðåäñòàðòîâûé ðàñ÷åò. Âûïîëíÿåòñÿ îäèí ðàç - ïðè çàïóñêå
// (è êàæäûé ðàç ïîñëå ñáîÿ ñâÿçè).
//
first=false;
//+--- Ìèíèìàëüíûé è ìàêñèìàëüíûé ðàçìåðû ëîòîâ
MinLot=MarketInfo(Symbol(),MODE_MINLOT);
if(MinLot<0.1) MinLotDgts=2; // ðàçìåðíîñòü ìèíëîòà
else
{
if(MinLot<1.0) MinLotDgts=1;
else MinLotDgts=0;
}
MaxLot=MarketInfo(Symbol(),MODE_MAXLOT);
//----
return;
}
//+------------------------------------------------------------------+
void init(){
if(Period()==5){period= 15;GrossPeriod=30;}
if(Period()==15){period= 30;GrossPeriod=60;}
if(Period()==30){period= 60;GrossPeriod=240;}
if(Period()==60){period= 240;GrossPeriod=1440;}
if(Period()==240){period= 1440;GrossPeriod=10080;}
if(Period()==1440){period= 10080;GrossPeriod=43200;}
if(Period()<5||Period()>10080){GrossPeriod=0;}return;}
//-------------------------------------------------------------------
int start()
{
if(NewDay()){newday=true;}
if(GrossPeriod==0){Comment("Íå ïðàâèëüíûé ïåðèîä, Ðàáoòà îñòàíîâëåííà!"); return(0);}
if(first==true) FirstCalc();
// Æäåì, êîãäà ñôîðìèðóåòñÿ íîâûé áàð
if (Time[0] == prevtime) return(0);
prevtime = Time[0];
buy=false;sell=false; close=false;
//------------Ïåðåâîä â áåçóáûòîê------------------------------------+
if(OrdersTotal()>0&&_Bu){
for(int x=0;x<OrdersTotal();x++){
if(OrderSelect(x,SELECT_BY_POS,MODE_TRADES)){
Bu(OrderTicket());}}}
//------------×èòàåì èíôó èç èíäèêàòîðà------------------------------+
//if(iCustom(NULL,GrossPeriod,"ZigAndZag",5,ZZbar)!=0){GrossTrand=1;SetArrow(241,3,true,Red);}
//if(iCustom(NULL,GrossPeriod,"ZigAndZag",6,ZZbar)!=0){GrossTrand=(-1);SetArrow(242,3,false,Red);}
if(iCustom(NULL,period,"ZigAndZag",4,Closebar)!=0){close=true;SetArrow(251,3,false,White);}
if(iCustom(NULL,GrossPeriod,"ZigAndZag",5,ZZbar)!=0){buy=true;SetArrow(241,1,true,Blue);}
if(iCustom(NULL,GrossPeriod,"ZigAndZag",6,ZZbar)!=0){sell=true;SetArrow(242,1,false,Red);}
//Comment(close+"\n"+buy+"\n"+sell+"\n"+OrdersTotal());
Comment(GrossPeriod+"\n"+GrossTrand);
//------------Îòêðûòèå îðäåðîâ---------------------------------------+
if(Rew==0&&newday){//OpenPosition("",OP_BUY,Lots,Lots,Tp,magic)
if(buy&&OrdersTotal()<Maxord){OpenPosition("",OP_BUY,Lots,Sl,Tp,magic);buy=false;newday=false; }
if(sell&&OrdersTotal()<Maxord){OpenPosition("",OP_SELL,Lots,Sl,Tp,magic);sell=false;newday=false; }}
if(Rew>0&&newday){
if(buy&&OrdersTotal()<Maxord){OpenPosition("",OP_SELL,Lots,Sl,Tp,magic);sell=false;newday=false; }
if(sell&&OrdersTotal()<Maxord){OpenPosition("",OP_BUY,Lots,Sl,Tp,magic);buy=false; newday=false;}}
//------------Çàêðûòèå îðäåðîâ---------------------------------------+
if(OrdersTotal()>0){
if(((GetPosType()==0&&sell)||(GetPosType()==1&&buy))){
for(int i=0;i<OrdersTotal();i++){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(ClosePos==0){
if(iBarShift(NULL,CloseBars,OrderOpenTime())>0){del(OrderTicket());close=false;}}
if(ClosePos>0){del(OrderTicket());close=false;}
}}}}
//----
return(0);
}
//-------------------------------------------------------------------+
int GetPosType(){
for(int i=0;i<OrdersTotal();i++){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){return(OrderType());}}}
bool NewDay(){if(TimeHour(TimeCurrent())==0&&TimeMinute(TimeCurrent())<10){return(true);}return(false);}
//+------------------------------------------------------------------+
void SetArrow(int kod,int razm,bool ApDn,color col){if(Drive){
string Name=TimeToStr(TimeLocal(),TIME_DATE|TIME_MINUTES);
if(!ApDn){double prs=Ask+20*Point;}else{prs=Bid-20*Point;}
//Comment(prs+"\n"+Name);
if(!ObjectCreate(Name,OBJ_ARROW,0,0,0,0,0,0,0)){Comment(GetLastError());return;}
if(!ObjectSet(Name,OBJPROP_ARROWCODE,kod)){Comment(GetLastError());}
if(!ObjectSet(Name,OBJPROP_STYLE,DRAW_ARROW)){Comment(GetLastError());}
if(!ObjectSet(Name,OBJPROP_TIME1,Time[0])){Comment(GetLastError());}
if(!ObjectSet(Name,OBJPROP_PRICE1,prs)){Comment(GetLastError());}
if(!ObjectSet(Name,OBJPROP_WIDTH,razm)){Comment(GetLastError());}
if(!ObjectSet(Name,OBJPROP_COLOR,col)){Comment(GetLastError());}}
return;}
//-----------------------------------------------------------------------------+
// Ôóíêöèÿ çàêðûâàåò ðûíî÷íûé îðäåð ñ ïåðåäàííûì åé ìàãèêîì |
//-----------------------------------------------------------------------------+
int del(int ticket){
int err;
GetLastError();//îáíóëÿåì îøèêó
OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
string symbol = OrderSymbol();
//----------------------------
if(OrderType()==OP_BUY){
RefreshRates();
double prise = MarketInfo(symbol,MODE_BID);
OrderClose(ticket,OrderLots(),prise,3,Green);
err = GetLastError();}
if(OrderType()==OP_SELL){
RefreshRates();
prise = MarketInfo(symbol,MODE_ASK);
OrderClose(ticket,OrderLots(),prise,3,Green);
err = GetLastError();}
//---------------------------
if (err == 0&&UseSound){PlaySound("expert.wav");}
else{PlaySound("timeout.wav");Print(err);}
return(err);}
//-------------------------------------------------------------------+
// ôóíêöèÿ ïåðåâîäèò ÑË â áó èëè íà íóæíûé óðîâåíü +
//+------------------------------------------------------------------+
int Bu(int ti=0)
{
int err;double sl;
if(ti==0){return(-1);}
if(OrderSelect(ti,SELECT_BY_TICKET,MODE_TRADES)&&(OrderCloseTime()==0)){
if(bu==0){sl=OrderOpenPrice();}else{
if(OrderType()==OP_BUY) {sl=NormalizeDouble((OrderOpenPrice()+bu*Point),Digits);}
if(OrderType()==OP_SELL){sl=NormalizeDouble((OrderOpenPrice()-bu*Point),Digits);}}
if(OrderType()==OP_BUY){
if(sl<MarketInfo(OrderSymbol(),MODE_BID)-(MarketInfo(OrderSymbol(),MODE_STOPLEVEL)*Point)&&sl!=OrderStopLoss()){
err = OrderModify(ti,OrderOpenPrice(),sl,OrderTakeProfit(),0,White);}}
if(OrderType()==OP_SELL){
if(sl>MarketInfo(OrderSymbol(),MODE_ASK)+(MarketInfo(OrderSymbol(),MODE_STOPLEVEL)*Point)&&sl!=OrderStopLoss()){
err = OrderModify(ti,OrderOpenPrice(),sl,OrderTakeProfit(),0,White);}}}
return(err);
}
//--------------------------------------------------------------------+
//-----------------------------------------------------------------------------+
//___________________ÊÈÌÓ_______ÐÅÑÏÅÊÒ________È_____ÓÂÀÆÓÕÀ___________________|
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 01.09.2005 |
//| Îïèñàíèå : Âûâîä ñîîáùåíèÿ â êîììåíò è â æóðíàë |
//+----------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| m - òåêñò ñîîáùåíèÿ |
//+----------------------------------------------------------------------------+
void Message(string m) {
Comment(m);
if (StringLen(m)>0) Print(m);
}
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 28.11.2006 |
//| Îïèñàíèå : Ìîäèôèêàöèÿ îäíîãî ïðåäâàðèòåëüíî âûáðàííîãî îðäåðà. |
//+----------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| pp - öåíà óñòàíîâêè îðäåðà |
//| sl - öåíîâîé óðîâåíü ñòîïà |
//| tp - öåíîâîé óðîâåíü òåéêà |
//| ex - äàòà èñòå÷åíèÿ |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) {
bool fm;
color cl=Red;
double op, pa, pb, os, ot;
int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
if (pp<=0) pp=OrderOpenPrice();
if (sl<0 ) sl=OrderStopLoss();
if (tp<0 ) tp=OrderTakeProfit();
pp=NormalizeDouble(pp, dg);
sl=NormalizeDouble(sl, dg);
tp=NormalizeDouble(tp, dg);
op=NormalizeDouble(OrderOpenPrice() , dg);
os=NormalizeDouble(OrderStopLoss() , dg);
ot=NormalizeDouble(OrderTakeProfit(), dg);
if (pp!=op || sl!=os || tp!=ot) {
for (it=1; it<=NumberOfTry; it++) {
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
while (!IsTradeAllowed()) Sleep(5000);
RefreshRates();
fm=OrderModify(OrderTicket(), pp, sl, tp, ex, cl);
if (fm) {
if (UseSound) PlaySound(NameFileSound); break;
} else {
er=GetLastError();
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it);
Print("Ask=",pa," Bid=",pb," sy=",OrderSymbol(),
" op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp);
Sleep(1000*10);
}
}
}
}
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 06.03.2008 |
//| Îïèñàíèå : Âîçâðàùàåò ôëàã ñóùåñòâîâàíèÿ ïîçèöèé |
//+----------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| sy - íàèìåíîâàíèå èíñòðóìåíòà ("" - ëþáîé ñèìâîë, |
//| NULL - òåêóùèé ñèìâîë) |
//| op - îïåðàöèÿ (-1 - ëþáàÿ ïîçèöèÿ) |
//| mn - MagicNumber (-1 - ëþáîé ìàãèê) |
//| ot - âðåìÿ îòêðûòèÿ ( 0 - ëþáîå âðåìÿ îòêðûòèÿ) |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (ot<=OrderOpenTime()) return(True);
}
}
}
}
}
}
return(False);
}
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 01.09.2005 |
//| Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òîðãîâîé îïåðàöèè |
//+----------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| op - èäåíòèôèêàòîð òîðãîâîé îïåðàöèè |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
switch (op) {
case OP_BUY : return("Buy");
case OP_SELL : return("Sell");
case OP_BUYLIMIT : return("BuyLimit");
case OP_SELLLIMIT: return("SellLimit");
case OP_BUYSTOP : return("BuyStop");
case OP_SELLSTOP : return("SellStop");
default : return("Unknown Operation");
}
}
//-----------------------------------------------------------------------------
double GetOrderLot(){
for (int i=0; i<OrdersTotal(); i++){
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){double lot = OrderLots();}}
if(lot==0){lot=Lots;}else{lot=lot+Lots;}
return(lot);}
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 10.04.2008 |
//| Îïèñàíèå : Îòêðûâàåò ïîçèöèþ ïî ðûíî÷íîé öåíå. |
//+----------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| sy - íàèìåíîâàíèå èíñòðóìåíòà (NULL èëè "" - òåêóùèé ñèìâîë) |
//| op - îïåðàöèÿ |
//| ll - ëîò |
//| sl - óðîâåíü ñòîï |
//| tp - óðîâåíü òåéê |
//| mn - MagicNumber |
//+----------------------------------------------------------------------------+
void OpenPosition(string sy, int op, double ll, double Sl=0, double Tp=0, int mn=0) {
color clOpen;
datetime ot;
double pp, pa, pb, sl, tp;
int dg, err, it, ticket=0;
string lsComm="";
if(Autolot){ll=GetOrderLot();}
if (op<1){
if (Sl>0) sl=MarketInfo(Symbol(),MODE_ASK)-Sl*Point; else sl=0;
if (Tp>0) tp=MarketInfo(Symbol(),MODE_ASK)+Tp*Point; else tp=0;
}else{
if (Sl>0) sl=MarketInfo(Symbol(),MODE_BID)+Sl*Point; else sl=0;
if (Tp>0) tp=MarketInfo(Symbol(),MODE_BID)-Tp*Point; else tp=0;
}
if (sy=="" || sy=="0") sy=Symbol();
if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell;
for (it=1; it<=NumberOfTry; it++) {
if (!IsTesting() && IsStopped()) {
Print("OpenPosition(): Îñòàíîâêà ðàáîòû ôóíêöèè");
break;
}
while (!IsTradeAllowed()) Sleep(5000);
RefreshRates();
dg=MarketInfo(sy, MODE_DIGITS);
pa=MarketInfo(sy, MODE_ASK);
pb=MarketInfo(sy, MODE_BID);
if (op==OP_BUY) pp=pa; else pp=pb;
pp=NormalizeDouble(pp, dg);
ot=TimeCurrent();
if (MarketWatch)
ticket=OrderSend(sy, op, ll, pp, Slippage, 0, 0, lsComm, mn, 0, clOpen);
else
ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, lsComm, mn, 0, clOpen);
if (ticket>0) {
if (UseSound) PlaySound(NameFileSound); break;
} else {
err=GetLastError();
if (pa==0 && pb==0) Message("Ïðîâåðüòå â Îáçîðå ðûíêà íàëè÷èå ñèìâîëà "+sy);
// Âûâîä ñîîáùåíèÿ îá îøèáêå
Print("Error(",err,") opening position: ",ErrorDescription(err),", try ",it);
Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=",GetNameOP(op),
" pp=",pp," sl=",sl," tp=",tp," mn=",mn);
// Áëîêèðîâêà ðàáîòû ñîâåòíèêà
if (err==2 || err==64 || err==65 || err==133) {
gbDisabled=True; break;
}
// Äëèòåëüíàÿ ïàóçà
if (err==4 || err==131 || err==132) {
Sleep(1000*300); break;
}
if (err==128 || err==142 || err==143) {
Sleep(1000*66.666);
if (ExistPositions(sy, op, mn, ot)) {
if (UseSound) PlaySound(NameFileSound); break;
}
}
if (err==140 || err==148 || err==4110 || err==4111) break;
if (err==141) Sleep(1000*100);
if (err==145) Sleep(1000*17);
if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
if (err!=135) Sleep(1000*7.7);
}
}
if (MarketWatch && ticket>0 && (sl>0 || tp>0)) {
if (OrderSelect(ticket, SELECT_BY_TICKET)) ModifyOrder(-1, sl, tp);
}
}
//+----------------------------------------------------------------------------+
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---