Orders Execution
Indicators Used
Miscellaneous
0
Views
0
Downloads
0
Favorites
e-BFs
//+----------------------------------------------------------------------------+
//| e-BFs.mq4 |
//| Èäåÿ Nemezis, ðåàëèçàöèÿ Êèì Èãîðü Â. aka KimIV |
//| http://www.kimiv.ru |
//| |
//| 07.10.2006 Ñîâåòíèê íà îñíîâå èíäèêàòîðà Fractals. |
//| Âûñòàâëåíèå îðäåðîâ íà ïðîáîé ôðàêòàëîâ. |
//| Âûõîäû ïî SL, TP è òðàëó. |
//+----------------------------------------------------------------------------+
#property copyright "Nemezis & KimIV"
#property link "http://www.kimiv.ru"
#define MAGIC 20061007
//------- Âíåøíèå ïàðàìåòðû ñîâåòíèêà ------------------------------------------
extern string _P_Orders = "---------- Ïàðàìåòðû îðäåðîâ";
extern int Distance = 15; // ðàññòîÿíèå óñòàíîâêè
extern int StopLoss = 30; // ñòîï
extern int TakeProfit = 100; // òåéê
extern int TrailingStop = 65; // òðàë
extern string _P_Expert = "---------- Ïàðàìåòðû ñîâåòíèêà";
extern int NumberAccount = 0; // Íîìåð òîðãîâîãî ñ÷¸òà
extern bool UseSound = False; // Èñïîëüçîâàòü çâóêîâîé ñèãíàë
extern string NameFileSound = "expert.wav"; // Íàèìåíîâàíèå çâóêîâîãî ôàéëà
extern string _P_Trade = "---------- Ïàðàìåòðû òîðãîâëè";
extern int Slippage = 3; // Ïðîñêàëüçûâàíèå öåíû
extern int NumberOfTry = 7; // Êîëè÷åñòâî ïîïûòîê
extern int PauseAfterError = 45; // Ïàóçà ïîñëå îøèáêè â ñåêóíäàõ
extern int TrailingStep = 5; // Øàã òðàëà
//------- Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà --------------------------------------
color clOpenBuy = LightBlue; // Öâåò îòêðûòèÿ ïîêóïêè
color clOpenSell = LightCoral; // Öâåò îòêðûòèÿ ïðîäàæè
color clModifyBuy = Aqua; // Öâåò ìîäèôèêàöèè ïîêóïêè
color clModifySell = Tomato; // Öâåò ìîäèôèêàöèè ïðîäàæè
color clCloseBuy = Blue; // Öâåò çàêðûòèÿ ïîêóïêè
color clCloseSell = Red; // Öâåò çàêðûòèÿ ïðîäàæè
string Name_Expert = "e-BFs"; // Íàèìåíîâàíèå ýêñïåðòà
double loFractal, upFractal;
int CurrentSpread, minStopLevel, prevTimeBar;
//------- Ïîêëþ÷åíèå âíåøíèõ ìîäóëåé -------------------------------------------
#include <b-Lots.mqh>
#include <stdlib.mqh>
//+----------------------------------------------------------------------------+
//| expert initialization function |
//+----------------------------------------------------------------------------+
void init() {
CurrentSpread=MarketInfo(Symbol(), MODE_SPREAD);
if (CurrentSpread<1) CurrentSpread=5;
minStopLevel=MarketInfo(Symbol(), MODE_STOPLEVEL);
if (minStopLevel<1) minStopLevel=10;
}
//+----------------------------------------------------------------------------+
//| expert deinitialization function |
//+----------------------------------------------------------------------------+
void deinit() { if (!IsTesting()) Comment(""); }
//+----------------------------------------------------------------------------+
//| expert start function |
//+----------------------------------------------------------------------------+
void start() {
if (!IsTesting()) {
if (NumberAccount>0 && AccountNumber()!=NumberAccount) {
Comment("Íà ñ÷¸òå "+AccountNumber()+" òîðãîâëÿ ÇÀÏÐÅÙÅÍÀ!");
return;
} else Comment("");
}
if (prevTimeBar>0 && prevTimeBar!=Time[0]) {
loFractal=FindNearFractal("", 0, MODE_LOWER);
upFractal=FindNearFractal("", 0, MODE_UPPER);
SetOrders();
}
ModifyOrders();
prevTimeBar=Time[0];
}
//+----------------------------------------------------------------------------+
//| Âîçâðàùàåò ôëàã ñóùåñòâîâàíèÿ ïîçèöèè èëè îðäåðà ïî MagicNumber |
//| Ïàðàìåòðû: |
//| mn - äîáàâêà ê MagicNumber |
//+----------------------------------------------------------------------------+
bool ExistOrderByMN(int mn) {
for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderMagicNumber()==MAGIC+mn) return(True);
}
}
return(False);
}
//+----------------------------------------------------------------------------+
//| Ïîèñê áëèæàéøåãî ôðàêòàëà. |
//| Ïàðàìåòðû: |
//| sym - íàèìåíîâàíèå èíñòðóìåíòà |
//| tf - òàéìôðåéì |
//| mode - òèï ôðàêòàëà |
//+----------------------------------------------------------------------------+
double FindNearFractal(string sym, int tf, int mode) {
if (sym=="") sym=Symbol();
double f=0;
int dg=MarketInfo(sym, MODE_DIGITS), s;
for (s=2; s<100; s++) {
f=iFractals(sym, tf, mode, s);
if (f!=0) return(NormalizeDouble(f, dg));
}
return(0);
}
//+----------------------------------------------------------------------------+
//| Âîçâðàùàåò íàèìåíîâàíèå òàéìôðåéìà |
//+----------------------------------------------------------------------------+
string GetNameTF(int TimeFrame) {
switch (TimeFrame) {
case PERIOD_M1: return("M1");
case PERIOD_M5: return("M5");
case PERIOD_M15: return("M15");
case PERIOD_M30: return("M30");
case PERIOD_H1: return("H1");
case PERIOD_H4: return("H4");
case PERIOD_D1: return("Daily");
case PERIOD_W1: return("Weekly");
case PERIOD_MN1: return("Monthly");
default: return("UnknownPeriod");
}
}
//+----------------------------------------------------------------------------+
//| Ìîäèôèêàöèÿ îðäåðîâ |
//+----------------------------------------------------------------------------+
void ModifyOrders() {
double ldStop=0, ldTake=0, oop;
double pAsk=upFractal+(Distance+CurrentSpread)*Point;
double pBid=loFractal-Distance*Point;
for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symbol()) {
if (OrderMagicNumber()==MAGIC+1) {
if (OrderType()==OP_BUY) {
if (Bid-OrderOpenPrice()>TrailingStop*Point) {
if (OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*Point) {
ModifyStopLoss(Bid-TrailingStop*Point, clModifyBuy);
}
}
}
if (OrderType()==OP_BUYSTOP) {
oop=NormalizeDouble(OrderOpenPrice(), Digits);
if (oop!=pAsk) {
if (StopLoss!=0) ldStop=pAsk-StopLoss*Point;
if (TakeProfit!=0) ldTake=pAsk+TakeProfit*Point;
OrderModify(OrderTicket(), pAsk, ldStop, ldTake, 0, clModifyBuy);
}
}
}
if (OrderMagicNumber()==MAGIC+2) {
if (OrderType()==OP_SELL) {
if (OrderOpenPrice()-Ask>TrailingStop*Point) {
if (OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss()==0) {
ModifyStopLoss(Ask+TrailingStop*Point, clModifySell);
}
}
}
if (OrderType()==OP_SELLSTOP) {
oop=NormalizeDouble(OrderOpenPrice(), Digits);
if (oop!=pBid) {
if (StopLoss!=0) ldStop=pBid+StopLoss*Point;
if (TakeProfit!=0) ldTake=pBid-TakeProfit*Point;
OrderModify(OrderTicket(), pBid, ldStop, ldTake, 0, clModifySell);
}
}
}
}
}
}
}
//+----------------------------------------------------------------------------+
//| Ïåðåíîñ óðîâíÿ StopLoss |
//| Ïàðàìåòðû: |
//| ldStop - óðîâåíü StopLoss |
//| lcColor - öâåò |
//+----------------------------------------------------------------------------+
void ModifyStopLoss(double ldStop, color lcColor=CLR_NONE) {
bool fm;
double ldOpen=OrderOpenPrice();
double ldTake=OrderTakeProfit();
int err, it;
for (it=1; it<=NumberOfTry; it++) {
while (!IsTradeAllowed()) Sleep(5000);
RefreshRates();
fm=OrderModify(OrderTicket(), ldOpen, ldStop, ldTake, 0, lcColor);
if (fm) {
if (UseSound) PlaySound(NameFileSound); break;
} else {
err=GetLastError();
Print("Error(",err,") modifying StopLoss: ",ErrorDescription(err),", try ",it);
Sleep(1000*PauseAfterError);
}
}
}
//+----------------------------------------------------------------------------+
//| Óñòàíîâêà îðäåðà |
//| Ïàðàìåòðû: |
//| op - îïåðàöèÿ |
//| pp - öåíà |
//| ldStop - óðîâåíü ñòîï |
//| ldTake - óðîâåíü òåéê |
//| mn - äîáàâêà ê ìàãèêó |
//+----------------------------------------------------------------------------+
void SetOrder(int op, double pp, double ldStop, double ldTake, int mn) {
color clOpen;
int err, it, ticket;
string lsComm=Name_Expert+" "+GetNameTF(Period());
if (op==OP_BUYLIMIT || op==OP_BUYSTOP) clOpen=clOpenBuy; else clOpen=clOpenSell;
Lots=GetSizeLot();
for (it=1; it<=NumberOfTry; it++) {
while (!IsTradeAllowed()) Sleep(5000);
RefreshRates();
ticket=OrderSend(Symbol(),op,Lots,pp,Slippage,ldStop,ldTake,lsComm,MAGIC+mn,0,clOpen);
if (ticket>0) {
if (UseSound) PlaySound(NameFileSound); break;
} else {
err=GetLastError();
if (err==128 || err==142 || err==143 || err==144) {
Sleep(1000*PauseAfterError);
if (ExistOrderByMN(mn)) {
if (UseSound) PlaySound(NameFileSound); break;
}
Print("Error(",err,") set order: ",ErrorDescription(err),", try ",it);
continue;
}
Print("Error(",err,") set order: ",ErrorDescription(err),", try ",it);
if (err==4110 || err==4111) break;
Sleep(1000*PauseAfterError);
}
}
}
//+----------------------------------------------------------------------------+
//| Óñòàíîâêà îðäåðîâ |
//+----------------------------------------------------------------------------+
void SetOrders() {
double pp, ldStop=0, ldTake=0;
int sb=0;
if (!ExistOrderByMN(1)) {
pp=upFractal+(Distance+CurrentSpread)*Point;
if (pp-Ask>minStopLevel*Point) {
if (StopLoss!=0) ldStop=pp-StopLoss*Point;
if (TakeProfit!=0) ldTake=pp+TakeProfit*Point;
SetOrder(OP_BUYSTOP, pp, ldStop, ldTake, 1);
}
}
if (!ExistOrderByMN(2)) {
pp=loFractal-Distance*Point;
if (Bid-pp>minStopLevel*Point) {
if (StopLoss!=0) ldStop=pp+StopLoss*Point;
if (TakeProfit!=0) ldTake=pp-TakeProfit*Point;
SetOrder(OP_SELLSTOP, pp, ldStop, ldTake, 2);
}
}
}
//+----------------------------------------------------------------------------+
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
---