Orders Execution
Miscellaneous
0
Views
0
Downloads
0
Favorites
7Kvadrat_vz_1_7
//+------------------------------------------------------------------+
//| !Kvadrat.mq4 |
//| Copyright 2012, Melniciuc Alexei |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, Melniciuc Alexei"
#property link ""
//--- input parameters
extern string Name="!Kvadrat";
extern double MinLot=0.1;
extern double MaxLot=3;
extern int TakeProfit=100 ; // 1 Lot = TakeProfit USD
extern int Grid=160; // Razmer setki v pipsah
extern double A=0.6; // -1.00 -0.00- +1.00 otklonenie SL ot Centra
extern bool Stop=false;
extern bool Delete=false;
//---- constants
#define BACK 10000
int KvadratMN;
string Prefix;
bool kSoundClose=true, kSoundOpen=true, kForceClose=false, kLastSound=false;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
Prefix=Symbol()+"!Kvadrat.";
if(IsTesting())Prefix=Prefix+"Test.";
if(!GlobalVariableCheck(Prefix+"Center") || IsTesting())GlobalVariableSet(Prefix+"Center",0);
if(!GlobalVariableCheck(Prefix+"Ticket") || IsTesting()){GlobalVariableSet(Prefix+"Ticket",0); SetNullTicket();}
KvadratMN=0; for(int i=0; i<StringLen(Prefix); i++)KvadratMN+=StringGetChar(Prefix,i);
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
RefreshRates();
// ================= Çàêðûòèå ñäåëêè ===================================
{//1
if(Delete){Delete=false; ObjectDelete("Message"); CloseAll(); SetNullTicket();}
if(EsliPara()==22){kForceClose=DeleteIfOpened(); return(0);}
if(kSoundClose){kSoundClose=false; ObjectDelete("Message"); SoundAlert();}
if(kForceClose && kLastSound)kSoundOpen=false; else kSoundOpen=true;
}//1
// ================= Seting Grid =======================================
{//2
if(!Stop)SetKvadrat();
}//2
//----
return(0);
}
//+------------------------------------------------------------------+
bool CloseAll() {
bool closed=true;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
while(IsTradeContextBusy())Sleep(100);
RefreshRates();
if(OrderMagicNumber()==KvadratMN){
if(OrderType()==OP_BUY){
closed=closed && OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),1,White);
}
if(OrderType()==OP_SELL){
closed=closed && OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),1,White);
}
if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP){
closed=closed && OrderDelete(OrderTicket(),White);
}
}
}
}
return(closed);
}
int EsliPara(){
int n=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderMagicNumber()==KvadratMN){
n++;
}
}
}
if(n==0)n=-1; else if(n==2)n=22; else if(n==1)n=OrderType(); else n=-2;
return(n);
}
double Profit(){
double p=0; bool k=true;
int NewTicket, Ticket=GlobalVariableGet(Prefix+"Ticket");
for(int i=OrdersHistoryTotal()-1; i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
if(OrderMagicNumber()==KvadratMN){
if(k){k=false; NewTicket=OrderTicket();}
if(OrderTicket()==Ticket)return(p);
if(OrderProfit()>0){GlobalVariableSet(Prefix+"Ticket",NewTicket); return(0);}
p+=OrderProfit();
}
}
}
return(p);
}
void SetNullTicket(){
for(int i=OrdersHistoryTotal()-1; i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
if(OrderMagicNumber()==KvadratMN){
GlobalVariableSet(Prefix+"Ticket",OrderTicket()); return(0);
}
}
}
return(0);
}
void SetKvadrat(){
RefreshRates();
static int k1=-1, k2=-1;
double Center=GlobalVariableGet(Prefix+"Center");
string Comments=DoubleToStr(Center,Digits)+" KVADRAT";
bool u=false, d=false;
if(EsliPara()>1 && k1==-1 && k2==-1)CloseAll();
if(EsliPara()==0)u=true;
if(EsliPara()==1)d=true;
if(Profit()==0 && !u && !d){
int i=1, pDW=-1, pUP=-1;
while(pUP==-1 && pDW==-1 && i<=BACK){
if(Close[i]-Close[0]>=+Grid*Point)pDW=i; // DOWN
if(Close[i]-Close[0]<=-Grid*Point)pUP=i; // UP
i++;
}
if(pUP!=-1)u=true;
if(pDW!=-1)d=true;
int op;
double tp, sl, entry=Close[0]; Center=Close[0];
if(u){Center=Ask-Grid*Point; tp=Center+2*Grid*Point; sl=Center-A*Grid*Point; entry=Ask; op=OP_BUY;}
if(d){Center=Bid+Grid*Point; tp=Center-2*Grid*Point; sl=Center+A*Grid*Point; entry=Bid; op=OP_SELL;}
GlobalVariableSet(Prefix+"Center",Center);
Comments=DoubleToStr(Center,Digits)+" KVADRAT";
entry=NormalizeDouble(entry,Digits);
sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
if(entry!=Center)OrderSend(Symbol(),op,KvadratLot(),entry,1,sl,tp,Comments,KvadratMN,0,Blue);
}
double dif=100/(Grid*Point)*(Center-Bid)-100;
if(Ask-Center>0)dif=100/(Grid*Point)*(Ask-Center)-100;
dif=MathRound(dif);
if(dif>51 && Center!=0 && Profit()!=0 && !u && !d){
Message("New position dif="+DoubleToStr(dif,0)+"%");
SetNullTicket(); return(0);
}
if(dif>0 && Center!=0 && Profit()!=0 && !u && !d){
Message("Old position dif="+DoubleToStr(dif,0)+"%");
if(Close[0]-Center>0)u=true;
if(Close[0]-Center<0)d=true;
if(u){entry=Ask; tp=entry+Grid*Point; sl=Center-A*Grid*Point; op=OP_BUY;}
if(d){entry=Bid; tp=entry-Grid*Point; sl=Center+A*Grid*Point; op=OP_SELL;}
entry=NormalizeDouble(entry,Digits);
sl=NormalizeDouble(sl,Digits);
tp=NormalizeDouble(tp,Digits);
OrderSend(Symbol(),op,KvadratLot(),entry,1,sl,tp,Comments,KvadratMN,0,Blue);
}
if(!u && (Center+Grid*Point)-Ask>=MarketInfo(OrderSymbol(),MODE_STOPLEVEL)*Point && k1==-1)
k1=OrderSend(Symbol(),OP_BUYSTOP,KvadratLot(d),NormalizeDouble(Center+Grid*Point,Digits),1,NormalizeDouble(Center-A*Grid*Point,Digits),NormalizeDouble(Center+2*Grid*Point,Digits),Comments,KvadratMN,0,Lime);
if(!d && Bid-(Center-Grid*Point)>=MarketInfo(OrderSymbol(),MODE_STOPLEVEL)*Point && k2==-1)
k2=OrderSend(Symbol(),OP_SELLSTOP,KvadratLot(u),NormalizeDouble(Center-Grid*Point,Digits),1,NormalizeDouble(Center+A*Grid*Point,Digits),NormalizeDouble(Center-2*Grid*Point,Digits),Comments,KvadratMN,0,Blue);
if(EsliPara()==22){kSoundClose=true; k1=-1; k2=-1; kLastSound=false; if(kSoundOpen && (u || d)){PlaySound("alert2.wav"); kLastSound=true;}}
return(0);
}
double KvadratLot(bool flag=false){
// raw
//return(MinLot);
// raw
double l=(MinLot*TakeProfit-Profit())/Grid;
if(flag){
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderMagicNumber()==KvadratMN){
if(OrderType()==OP_BUY || OrderType()==OP_SELL){
l+=(1+A)*OrderLots();
break;
}
}
}
}
}
l=NormalizeDouble(l,2);
// stoploss
if(l>MaxLot){
if(!flag){Message("Stoploss Lot="+DoubleToStr(l,2)); SetNullTicket();}
l=MinLot;
}
// stoploss
if(l<MinLot)l=MinLot; //minimum lot
return(l);
}
void Message(string ms){
ObjectCreate("Message",OBJ_LABEL,0,0,0);
ObjectSet("Message",OBJPROP_CORNER,2);
ObjectSet("Message",OBJPROP_XDISTANCE,10);
ObjectSet("Message",OBJPROP_YDISTANCE,10);
ObjectSetText("Message",ms,15,"Arial Black",Red);
return(0);
}
void SoundAlert(){
for(int i=OrdersHistoryTotal()-1; i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
if(OrderMagicNumber()==KvadratMN){
if(OrderType()==OP_BUY || OrderType()==OP_SELL){
if(OrderProfit()>0){PlaySound("ok.wav"); return(0);}
PlaySound("timeout.wav"); return(0);
}
}
}
}
return(0);
}
bool DeleteIfOpened(){
static bool k3=false;
static int OldHistory=-1;
if(k3 && OldHistory==OrdersHistoryTotal())return(false);
OldHistory=OrdersHistoryTotal();
int k=0;
bool closed=true;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderMagicNumber()==KvadratMN){
if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)double lot=OrderLots();
k+=OrderType();
}
}
}
if(k==9){k3=false; return(false);}
if(k==5 && lot==KvadratLot(true)){k3=true; return(false);}
for(i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderMagicNumber()==KvadratMN){
if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP){
closed=closed && OrderDelete(OrderTicket(),White); break;
}
}
}
}
if(closed)kSoundClose=false;
return(true);
}
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
---