Price Data Components
Orders Execution
0
Views
0
Downloads
0
Favorites
tsunami_by_ms
//+------------------------------------------------------------------+
//| Copyright 2013, Alexandr Gavrilin |
//| http://sovetnikov.net |
//+------------------------------------------------------------------+
/*
26.05.2014
- ïðîôèò
- íåâèäèìûå ñòîïû è òåéêè
- çàêðûòèå âñåõ îðäåðîâ íà ôîðåêñ, ïðè äîñòèæåíèè ïðîôèòà
- ñáðîñ ëîòîâ íà íà÷àëüíûå ïðè äîñòèæåíèè ïðîôèòà îáùåãî
- òðàë
*/
#property copyright "Copyright 2013, DKeN (Alexandr Gavrilin)"
#property link "http://sovetnikov.net/"
#include <mt4lib.mqh>
string expert="";
extern bool forex=false; //åñëè ñ÷åò ôîðåêñ, òî òðóå, èíà÷å ôàëçå (íóæíî äëÿ çàêðûòèå ïî ïðîôèòó)
//extern string list="EURUSD GBPUSD AUDCAD AUDCHF AUDJPY AUDNZD AUDUSD CADCHF CADJPY CHFJPY EURAUD EURCAD EURCHF EURGBP EURJPY EURNZD GBPAUD GBPCAD GBPCHF GBPJPY NZDJPY NZDUSD USDCAD USDCHF USDJPY"; //è ò.ä. ÷åðåç ïðîáåë , íàèìåíîâàíèå äîëæíî ñîâïàäàòü ñ íàèìåíîâàíèåì â òåðìèíàëå (ñïèñîê äëÿ îïöèîíîâ, áåç ìåòàëëîâ)
extern string list="EURUSD_OP GBPUSD_OP AUDCAD_OP AUDCHF_OP AUDJPY_OP AUDNZD_OP AUDUSD_OP CADCHF_OP CADJPY_OP CHFJPY_OP EURAUD_OP EURCAD_OP EURCHF_OP EURGBP_OP EURJPY_OP EURNZD_OP GBPAUD_OP GBPCAD_OP GBPCHF_OP GBPJPY_OP NZDJPY_OP NZDUSD_OP USDCAD_OP USDCHF_OP USDJPY_OP"; //è ò.ä. ÷åðåç ïðîáåë , íàèìåíîâàíèå äîëæíî ñîâïàäàòü ñ íàèìåíîâàíèåì â òåðìèíàëå (ñïèñîê äëÿ îïöèîíîâ, áåç ìåòàëëîâ)
extern int magic=1310; //ìàäæèê
extern double start_lot=1; //íà÷àëüíûé ëîò
extern int timeout=4; //âðåìÿ äî ýêñïåðàöèè â ìèíóòàõ, åñëè 09 òî îòêëþ÷åíî
extern double tp=0; //òåéê
extern double sl=0; //ñòîï
extern double koef=2.5; //âî ñêîëüêî óâåëè÷èâàòü óáûòî÷íóþ ñäåëêó (ìíîæèòåëü ëîòà)
extern double max_lot=1000; //ìàêñèìàëüíûé ëîò, ïîñëå êîòîðîãî îñóùåñòâëÿåòñÿ ñáðîñ ëîòà íà íà÷àëüíûé, åñëè âûñòàâèòü ìàêñ ëîò 0, òî èãíîðèðóåì îãðàíè÷åíèå è óâåëè÷èâàåìñÿ äî ïîáåäíîãî (ïîêà íå ñîëüåò)
extern int signal_bar=1; //1 ïî çàêðûòèþ áàðà, 0 - ïî òåêóùåìó áàðó (ñèãíàë ìîæåò ïðîïàäàòü!)
extern int tf=0; //ðàáî÷èé ïåðèîä äëÿ èíäèêàòîðà! â ìèíóòàõ, âàðèàíòû: 1,5,15,30,60,240
extern double profit=100; //â áàêñàõ ïðîôèò, ïîñëå êîòîðîãî ñáðàñûâàåì
extern bool bVirtual=false; //íåâèäèìûå ñòîïû
extern double trailingstop=0; //òðåéëèíã ñòîï, óêàçàòü ïóíêòîâ ÷åðåç ñêîëêüî îí âêëþ÷àåòñÿ
extern int PriceActionFilter = 1;
extern int Length = 3;
extern int MajorCycleStrength = 4;
extern bool UseCycleFilter = false;
extern int UseFilterSMAorRSI = 1;
extern int FilterStrengthSMA = 12;
extern int FilterStrengthRSI = 21;
bool alertsOn=false;
extern bool alertsOnMajorCycle = true;
extern bool alertsOnMinorCycle = false;
bool alertsOnCurrent = false;
bool alertsMessage = false;
bool alertsSound = false;
bool alertsNotify = false;
bool alertsEmail = false;
bool arrowsVisible = true;
bool arrowsOnMajorCycle = true;
color arrowsMajorUpCycleColor = LimeGreen;
color arrowsMajorDnCycleColor = Red;
int arrowsMajorUpCycleCode = 241;
int arrowsMajorDnCycleCode = 242;
int arrowsMajorCycleSize = 2;
bool arrowsOnMinorCycle = true;
color arrowsMinorUpCycleColor = DeepSkyBlue;
color arrowsMinorDnCycleColor = PaleVioletRed;
int arrowsMinorUpCycleCode = 159;
int arrowsMinorDnCycleCode = 159;
int arrowsMinorCycleSize = 5;
string arrowsIdentifier = "ci arrows1";
double arrowsUpperGap = 1.0;
double arrowsLowerGap = 1.0;
bool check;
double balance=0;
datetime tm=0;
string symbols[];
int i_tf=0;
datetime tm_start=0;
double g_balance=0;
int max_thread=100; //ìàêñèìàëüíîå êîë-âî ïîòîêîâ , êîòîðûå óïðàâëÿåò ñîâåòíèê îäíîâðåìåííî, ôàêòè÷åñêè áóäåò ãàðàçäî ìåíüøå
bool bPause=false;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//----
bPause=false;
check=false;
tm=TimeCurrent();
i_tf=tf;
if(i_tf==0) i_tf=Period();
string s_list=list;
if(IsTesting()) s_list=Symbol();
ushort u_sep=StringGetCharacter(" ",0);
StringSplit(s_list,u_sep,symbols);
Print("Çàãðóæåíî èíñòðóìåíòîâ: ",ArraySize(symbols));
tm_start=(datetime)GlobalVariableGet(StringConcatenate(WindowExpertName(),".time"));
g_balance=GlobalVariableGet(StringConcatenate(WindowExpertName(),".balance"));
Comment("");
if(bVirtual) mvirtual_OrdersToVirtual();
else mvirtual_VirtualToOrders();
//----
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//----
Comment("");
if(bVirtual) virtual_deinit();
//----
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick()
{
//----
if(!work_check(check)) return;
if(bVirtual) virtual2_init();
if(forex) trailing_forex(trailingstop,trailingstop,5,bVirtual);
if(!IsTesting())
{
tm_start=(datetime)GlobalVariableGet(StringConcatenate(WindowExpertName(),".time"));
g_balance=GlobalVariableGet(StringConcatenate(WindowExpertName(),".balance"));
}
if(g_balance!=0.0 && profit>0)
{
double pr=NormalizeDouble(AccountEquity()-g_balance,2);
Comment("Ïðèáûëü â $: ",DoubleToString(pr,2),"\nÑîõðàíåííûé áàëàíñ: ",g_balance,"\nÝêâèòè: ",AccountEquity());
if(pr>=profit)
{
if(forex) my_OrderCloseAll();
bPause=true; //çàïðåòèì îòêðûòèå íîâûõ îðäåðîâ
}
}
int orders[7],all,i;
double lot;
all=0;
ArrayInitialize(orders,0);
if(IsTesting() || IsOptimization())
{
if(timeout>0)
{
for(i=OrdersTotal()-1;i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderMagicNumber()==magic)
{
if(TimeCurrent()-OrderOpenTime()>=timeout*60) order_OrderClose(OrderTicket(),-1,0,CLR_NONE);
}
}
}
}
int _all=0;
for(i=OrdersTotal()-1;i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderMagicNumber()>=magic && OrderMagicNumber()<=magic+max_thread) //ïðîâåðèì åñòü ëè îòêðûòûå îðäåðà ïî äðóãèì èíñòðóìåíòàì
{
_all++;
}
}
if(_all==0 && (bPause || g_balance==0.0))
{
//Åñëè îðäåðî íåò, òî îáíîâèì äàííûå
tm_start=TimeCurrent();
if(!IsTesting())GlobalVariableSet(StringConcatenate(WindowExpertName(),".time"),tm_start);
g_balance=AccountBalance();
if(!IsTesting())GlobalVariableSet(StringConcatenate(WindowExpertName(),".balance"),g_balance);
bPause=false; //ñíèìåì ñ ïàóçå, ìîæíî îòêðûâàòü íîâûå îðäåðà
}
if(bPause) return; //åñëè ñîâåòíèê îñòàíîâèë íà ïàóçó òî æäåì êîãäà îðäåðà çàêðîþòñÿ è îí ñíîâà ðàçðåøèò òîðãîâàòü
int op=0;
bool bNew=bar_isNew(1,i_tf);
double buy[4],sell[4];
int imagic=0;
//ïðîãðàììíî îãðàíè÷èì 100 ïîòîêàìè
for(int m=0;m<max_thread;m++)
{
imagic=magic+m;
for(int j=0;j<ArraySize(symbols);j++)
{
if((bNew && signal_bar>0) || signal_bar==0)
{
op=0;
buy[0]=iCustom(symbols[j],i_tf,"ForexMT4Systems_Cycle",
PriceActionFilter,
Length,
MajorCycleStrength,
UseCycleFilter,
UseFilterSMAorRSI,
FilterStrengthSMA,
FilterStrengthRSI,
alertsOn,
alertsOnMajorCycle,
alertsOnMinorCycle,
alertsOnCurrent,
alertsMessage,
alertsSound,
alertsNotify,
alertsEmail,
arrowsVisible,
arrowsOnMajorCycle,
arrowsMajorUpCycleColor,
arrowsMajorDnCycleColor,
arrowsMajorUpCycleCode,
arrowsMajorDnCycleCode,
arrowsMajorCycleSize,
arrowsOnMinorCycle,
arrowsMinorUpCycleColor,
arrowsMinorDnCycleColor,
arrowsMinorUpCycleCode,
arrowsMinorDnCycleCode,
arrowsMinorCycleSize,
arrowsIdentifier,
arrowsUpperGap,
arrowsLowerGap,1,signal_bar);
buy[1]=iCustom(symbols[j],i_tf,"ForexMT4Systems_Cycle",
PriceActionFilter,
Length,
MajorCycleStrength,
UseCycleFilter,
UseFilterSMAorRSI,
FilterStrengthSMA,
FilterStrengthRSI,
alertsOn,
alertsOnMajorCycle,
alertsOnMinorCycle,
alertsOnCurrent,
alertsMessage,
alertsSound,
alertsNotify,
alertsEmail,
arrowsVisible,
arrowsOnMajorCycle,
arrowsMajorUpCycleColor,
arrowsMajorDnCycleColor,
arrowsMajorUpCycleCode,
arrowsMajorDnCycleCode,
arrowsMajorCycleSize,
arrowsOnMinorCycle,
arrowsMinorUpCycleColor,
arrowsMinorDnCycleColor,
arrowsMinorUpCycleCode,
arrowsMinorDnCycleCode,
arrowsMinorCycleSize,
arrowsIdentifier,
arrowsUpperGap,
arrowsLowerGap,1,signal_bar+1);
sell[0]=iCustom(symbols[j],i_tf,"ForexMT4Systems_Cycle",
PriceActionFilter,
Length,
MajorCycleStrength,
UseCycleFilter,
UseFilterSMAorRSI,
FilterStrengthSMA,
FilterStrengthRSI,
alertsOn,
alertsOnMajorCycle,
alertsOnMinorCycle,
alertsOnCurrent,
alertsMessage,
alertsSound,
alertsNotify,
alertsEmail,
arrowsVisible,
arrowsOnMajorCycle,
arrowsMajorUpCycleColor,
arrowsMajorDnCycleColor,
arrowsMajorUpCycleCode,
arrowsMajorDnCycleCode,
arrowsMajorCycleSize,
arrowsOnMinorCycle,
arrowsMinorUpCycleColor,
arrowsMinorDnCycleColor,
arrowsMinorUpCycleCode,
arrowsMinorDnCycleCode,
arrowsMinorCycleSize,
arrowsIdentifier,
arrowsUpperGap,
arrowsLowerGap,2,signal_bar);
sell[1]=iCustom(symbols[j],i_tf,"ForexMT4Systems_Cycle",
PriceActionFilter,
Length,
MajorCycleStrength,
UseCycleFilter,
UseFilterSMAorRSI,
FilterStrengthSMA,
FilterStrengthRSI,
alertsOn,
alertsOnMajorCycle,
alertsOnMinorCycle,
alertsOnCurrent,
alertsMessage,
alertsSound,
alertsNotify,
alertsEmail,
arrowsVisible,
arrowsOnMajorCycle,
arrowsMajorUpCycleColor,
arrowsMajorDnCycleColor,
arrowsMajorUpCycleCode,
arrowsMajorDnCycleCode,
arrowsMajorCycleSize,
arrowsOnMinorCycle,
arrowsMinorUpCycleColor,
arrowsMinorDnCycleColor,
arrowsMinorUpCycleCode,
arrowsMinorDnCycleCode,
arrowsMinorCycleSize,
arrowsIdentifier,
arrowsUpperGap,
arrowsLowerGap,2,signal_bar+1);
//minor
buy[2]=iCustom(symbols[j],i_tf,"ForexMT4Systems_Cycle",
PriceActionFilter,
Length,
MajorCycleStrength,
UseCycleFilter,
UseFilterSMAorRSI,
FilterStrengthSMA,
FilterStrengthRSI,
alertsOn,
alertsOnMajorCycle,
alertsOnMinorCycle,
alertsOnCurrent,
alertsMessage,
alertsSound,
alertsNotify,
alertsEmail,
arrowsVisible,
arrowsOnMajorCycle,
arrowsMajorUpCycleColor,
arrowsMajorDnCycleColor,
arrowsMajorUpCycleCode,
arrowsMajorDnCycleCode,
arrowsMajorCycleSize,
arrowsOnMinorCycle,
arrowsMinorUpCycleColor,
arrowsMinorDnCycleColor,
arrowsMinorUpCycleCode,
arrowsMinorDnCycleCode,
arrowsMinorCycleSize,
arrowsIdentifier,
arrowsUpperGap,
arrowsLowerGap,2,signal_bar);
buy[3]=iCustom(symbols[j],i_tf,"ForexMT4Systems_Cycle",
PriceActionFilter,
Length,
MajorCycleStrength,
UseCycleFilter,
UseFilterSMAorRSI,
FilterStrengthSMA,
FilterStrengthRSI,
alertsOn,
alertsOnMajorCycle,
alertsOnMinorCycle,
alertsOnCurrent,
alertsMessage,
alertsSound,
alertsNotify,
alertsEmail,
arrowsVisible,
arrowsOnMajorCycle,
arrowsMajorUpCycleColor,
arrowsMajorDnCycleColor,
arrowsMajorUpCycleCode,
arrowsMajorDnCycleCode,
arrowsMajorCycleSize,
arrowsOnMinorCycle,
arrowsMinorUpCycleColor,
arrowsMinorDnCycleColor,
arrowsMinorUpCycleCode,
arrowsMinorDnCycleCode,
arrowsMinorCycleSize,
arrowsIdentifier,
arrowsUpperGap,
arrowsLowerGap,2,signal_bar+1);
sell[2]=iCustom(symbols[j],i_tf,"ForexMT4Systems_Cycle",
PriceActionFilter,
Length,
MajorCycleStrength,
UseCycleFilter,
UseFilterSMAorRSI,
FilterStrengthSMA,
FilterStrengthRSI,
alertsOn,
alertsOnMajorCycle,
alertsOnMinorCycle,
alertsOnCurrent,
alertsMessage,
alertsSound,
alertsNotify,
alertsEmail,
arrowsVisible,
arrowsOnMajorCycle,
arrowsMajorUpCycleColor,
arrowsMajorDnCycleColor,
arrowsMajorUpCycleCode,
arrowsMajorDnCycleCode,
arrowsMajorCycleSize,
arrowsOnMinorCycle,
arrowsMinorUpCycleColor,
arrowsMinorDnCycleColor,
arrowsMinorUpCycleCode,
arrowsMinorDnCycleCode,
arrowsMinorCycleSize,
arrowsIdentifier,
arrowsUpperGap,
arrowsLowerGap,3,signal_bar);
sell[3]=iCustom(symbols[j],i_tf,"ForexMT4Systems_Cycle",
PriceActionFilter,
Length,
MajorCycleStrength,
UseCycleFilter,
UseFilterSMAorRSI,
FilterStrengthSMA,
FilterStrengthRSI,
alertsOn,
alertsOnMajorCycle,
alertsOnMinorCycle,
alertsOnCurrent,
alertsMessage,
alertsSound,
alertsNotify,
alertsEmail,
arrowsVisible,
arrowsOnMajorCycle,
arrowsMajorUpCycleColor,
arrowsMajorDnCycleColor,
arrowsMajorUpCycleCode,
arrowsMajorDnCycleCode,
arrowsMajorCycleSize,
arrowsOnMinorCycle,
arrowsMinorUpCycleColor,
arrowsMinorDnCycleColor,
arrowsMinorUpCycleCode,
arrowsMinorDnCycleCode,
arrowsMinorCycleSize,
arrowsIdentifier,
arrowsUpperGap,
arrowsLowerGap,3,signal_bar+1);
if(alertsOnMajorCycle && op==0)
{
if(buy[0]!=0 && buy[1]==0) op=1;
else if(sell[0]!=0 && sell[1]==0) op=-1;
}
if(alertsOnMinorCycle && op==0)
{
if(buy[2]!=0 && buy[3]==0) op=1;
else if(sell[2]!=0 && sell[3]==0) op=-1;
}
}
bool bContinue=false;
all=0;
ArrayInitialize(orders,0);
for(i=OrdersTotal()-1;i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(symbols[j]==OrderSymbol()) bContinue=true;
if(OrderMagicNumber()==imagic) //ïðîâåðèì åñòü ëè îòêðûòûå îðäåðà ïî äàííîìó ïîòîêó
{
orders[OrderType()]++;
all++;
}
}
if(bContinue) continue; //åñëè ìû íàøëè ÷òî ïî äàííîìó èíñòðóìåíòó åñòü îòêðûòàÿ ñäåëêà, òî äàííûé ñèãíàë ïðîïóñêàåòñÿ
if(all>0) continue; //ïðîïóñêàåì ñèãíàë åñëè åñòü îòêðûòûå ñäåëêè â ýòîì ïîòîêå
//åñëè îðäåðîâ â ïîòîêå íåò, òî ïðîâåðèì êàê çàêðûëèñü îðäåðà â ïîòîêå
if(all==0 && op!=0)
{
int minus=0;
double last_lot=0;
string smb="";
for(i=OrdersHistoryTotal()-1;i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
if(OrderMagicNumber()==imagic && OrderOpenTime()>=tm_start) //íàéäåì ïîñëåäíèé çàêðûòûé îðäåð
{
if(OrderType()==OP_BUY && ND3(OrderClosePrice()-OrderOpenPrice())<ND3(0.0)) minus=-1;
if(OrderType()==OP_SELL && ND3(OrderOpenPrice()-OrderClosePrice())<ND3(0.0)) minus=-1;
if(OrderType()==OP_BUY && ND3(OrderClosePrice()-OrderOpenPrice())>ND3(0.0)) minus=0;
if(OrderType()==OP_SELL && ND3(OrderOpenPrice()-OrderClosePrice())>ND3(0.0)) minus=0;
if(OrderType()==OP_BUY && ND3(OrderClosePrice()-OrderOpenPrice())==ND3(0.0))minus=1;
if(OrderType()==OP_SELL && ND3(OrderOpenPrice()-OrderClosePrice())==ND3(0.0))minus=1;
last_lot=OrderLots();
smb=OrderSymbol();
break;
}
}
if(smb==symbols[j] && minus==-1) continue; //åñëè ïî ýòîé ïàðå áûë ìèíóñ òî åãî ïðîïóñêàåì
//Comment("Êîë-âî ìèíóñîâûõ: ",minus);
if(minus==-1) lot=NLot(last_lot*koef);
if(minus==1) lot=NLot(last_lot);
if(minus==0) lot=NLot(start_lot);
if(lot>max_lot && max_lot>0) lot=NLot(start_lot); //âûñòàâèì ëîò íà íà÷àëüíûé
int type=-1;
if(op==1) type=OP_BUY; else type=OP_SELL;
//ïîäáèðàåì ëîò åñëè ó íàñ ðàññ÷èòàííûì íå õâàòèò ìàðæè
while(AccountFreeMarginCheck(symbols[j],type,lot)<=0 || GetLastError()==134)
{
lot=NLot(lot/koef); //ïðîáóåì óìåíüøèòü
}
if(op==1) order_OrderSendNDD(symbols[j],imagic,OP_BUY,lot,-1,sl,tp,DoubleToStr(timeout,0),0,clrBlue,bVirtual);
else if(op==-1) order_OrderSendNDD(symbols[j],imagic,OP_SELL,lot,-1,sl,tp,DoubleToStr(timeout,0),0,clrRed,bVirtual);
}
}
}
//----
}
//+------------------------------------------------------------------+
void my_OrderCloseAll()
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderMagicNumber()>=magic && OrderMagicNumber()<=magic+max_thread)
{ //ïðîâåðèì åñòü ëè îòêðûòûå îðäåðà ïî äðóãèì èíñòðóìåíòàì
order_OrderClose(OrderTicket(),-1,0,CLR_NONE);
}
}
}
//+------------------------------------------------------------------+
void trailing_forex(double level1,double step1,int trailingpause_time=5,bool bvirtual=false)
{
datetime tm_buy=0,tm_sell=0;
double st;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderType()>=2) continue;
if(OrderMagicNumber()>=magic && OrderMagicNumber()<=magic+max_thread)
{
string n=OrderSymbol();
double tick=MarketInfo(n,MODE_TICKSIZE);
double pt=0;
double stop=OrderStopLoss();
double p=p(n);
if(bvirtual) stop=virtual_get_sl(OrderTicket());
if(OrderType()==OP_BUY)
{
pt=(dBid(n)-OrderOpenPrice())/p;
// Print("buy pt=",pt);
st=NormalizeDouble(MathFloor((dBid(n)-step1*p)/tick)*tick,dDigits(n));
if(pt>=level1 && level1!=0)
{
if(stop==0 || (stop<st && TimeCurrent()-tm_buy>=trailingpause_time))
{
order_OrderModify(OrderTicket(),-1,st,-1,0,Green,bvirtual);
tm_buy=TimeCurrent();
continue;
}
}
}
if(OrderType()==OP_SELL)
{
pt=(OrderOpenPrice()-dAsk(n))/p;
st=NormalizeDouble(MathFloor((dAsk(n)+step1*p)/tick)*tick,dDigits(n));
if(pt>=level1 && level1!=0)
{
if(stop==0 || (stop>st && TimeCurrent()-tm_sell>=trailingpause_time))
{
order_OrderModify(OrderTicket(),-1,st,-1,0,Green,bvirtual);
tm_sell=TimeCurrent();
continue;
}
}
}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void mvirtual_OrdersToVirtual()
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderMagicNumber()>=magic && OrderMagicNumber()<=magic+max_thread)
{
if(OrderStopLoss()!=0.0 || OrderTakeProfit()!=0.0)
{
virtual_set(OrderTicket(),OrderStopLoss(),OrderTakeProfit());
order_OrderModify(OrderTicket(),OrderOpenPrice(),0,0,OrderExpiration(),CLR_NONE);
}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void mvirtual_VirtualToOrders()
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderMagicNumber()>=magic && OrderMagicNumber()<=magic+max_thread)
{
if(OrderStopLoss()==0.0 && OrderTakeProfit()==0.0 && virtual_check(OrderTicket()))
{
order_OrderModify(OrderTicket(),-1,virtual_get_sl(OrderTicket()),virtual_get_tp(OrderTicket()),0,CLR_NONE);
}
}
}
}
//+------------------------------------------------------------------+
bool virtual_check(int ticket){
if(ticket<=0) return (false);
string n;
if(IsTesting()) n=StringConcatenate("virtual_",DoubleToStr(ticket,0),"_tp");
else n=StringConcatenate(DoubleToStr(ticket,0),"_tp");
if(GlobalVariableCheck(n)) return (true);
if(IsTesting()) n=StringConcatenate("virtual_",DoubleToStr(ticket,0),"_sl");
else n=StringConcatenate(DoubleToStr(ticket,0),"_sl");
if(GlobalVariableCheck(n)) return (true);
return (false);
}
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
---