... вы не можете создать его снова, он уже существует... вместо этого проверьте, существует ли он, и если да, не пытайтесь создать его снова, просто переместите его с помощью ObjectSet().
Я не могу сделать условие истечения времени для ценового уровня. Как я уже говорил, если цена остается ниже LSell или выше LBuy более чем на 96 свечей, чтобы отклонить этот ценовой уровень.
Я пытался использовать if(Time[high_bar]<Time[96]) && LevelSset=true.... set LevelSset to false... но похоже это не работает.... void CkExpLSell ()... я уверен, что делаю что-то не так, но... я понятия не имею что, так что помогите пожалуйста :)
//+------------------------------------------------------------------+//| 3expert.mq4 |//| ant |//| |//+------------------------------------------------------------------+#property copyright"ant"#property link""#property indicator_chart_window#property indicator_buffers1#property indicator_color1 Yellow
externbool UseTrigger1=true;
externbool UseTrigger2=true;
externint Kperiod = 80;
externint Dperiod = 30;
externint Stochshift = 30;
externint AddToSL=0;
externint MinSL=50;
externint MaxSL=100;
externint TakeProfit=50;
externint Slippage=0;
externdouble lot=0.10;
int MagicNumber=777;
bool TriggerBuy1=false;
bool TriggerBuy2=false;
bool TriggerSell1=false;
bool TriggerSell2=false;
bool LevelBset=false;
bool LevelSset=false;
double LevelB,LevelS;
double ticketBuy,ticketSell;
double SL,TP;
double stoch;
double LBuy;
double LSell;
int high_bar,low_bar;
bool BarsOnChart;
bool AlternativeEntryB=false;
datetime AlternativeEntryBTime;
bool AlternativeEntryS=false;
datetime AlternativeEntrySTime;
//+------------------------------------------------------------------+//| expert initialization function |//+------------------------------------------------------------------+int init()
{
//----//----return(0);
}
//+------------------------------------------------------------------+//| expert deinitialization function |//+------------------------------------------------------------------+int deinit()
{
//----//----return(0);
}
//+------------------------------------------------------------------+//| expert start function |//+------------------------------------------------------------------+int start()
{
//----
stoch=iStochastic(NULL,0,Kperiod,Dperiod,Stochshift,MODE_SMA,1,MODE_MAIN,0);
SellLevelSet();
CkExpLSell ();
BuyLevelSet();
CkExpLBuy ();
if (LevelSset==true || LevelBset==true)
{
if (IsNewBar ())
{
CheckTrigger();
}
}
//----return(0);
}
//+------------------------------------------------------------------+////////////////////////////IsNewCandle///////////////////////////////bool IsNewBar ()
{
if (Bars==BarsOnChart)
return(false);
BarsOnChart = Bars;
return(true);
}
/////////////////////////////LSell Setup////////////////////////////////void SellLevelSet()
{
if (stoch>75 && LevelSset==false)
{
LSell=High[iHighest(NULL,0,MODE_HIGH,34,2)];
high_bar=iHighest(NULL,0,MODE_HIGH,34,2);
if(Bid<LSell && High[0]<LSell && High[1]<LSell)
{
ObjectCreate("tomato "+Time[0],OBJ_ARROW,0,Time[high_bar],LSell+Point*20);
ObjectSet("tomato "+Time[0],OBJPROP_ARROWCODE,242);
ObjectSet("tomato "+Time[0],OBJPROP_COLOR,Tomato);
LevelSset=true;
Print("LevelSset on "+DoubleToStr(LSell,5));
}
}
}
///////////////////////////////LSellCheckExp/////////////////////////////////void CkExpLSell ()
{
if(LevelSset==true)
{
if(Close[2]>LSell && Close[1]>LSell) //LSell expires after two bars close over
{
LevelSset=false;
Print (DoubleToStr(LSell,5)+" expired - close");
}
if(Time[high_bar]<Time[96]) //LSell expires after 96 bars
{
LevelSset=false;
Print (DoubleToStr(LSell,5)+" expired - time");
}
}
}
/////////////////////////////LBuy Setup////////////////////////////////void BuyLevelSet()
{
if (stoch<25 && LevelBset==false)
{
LBuy=Low[iLowest(NULL,0,MODE_HIGH,34,2)];
low_bar=iLowest(NULL,0,MODE_HIGH,34,2);
if(Bid>LBuy && Low[0]>LBuy && Low[1]>LBuy)
{
ObjectCreate("olive "+Time[0],OBJ_ARROW,0,Time[low_bar],LBuy-Point*20);
ObjectSet("olive "+Time[0],OBJPROP_ARROWCODE,241);
ObjectSet("olive "+Time[0],OBJPROP_COLOR,Olive);
LevelBset=true;
Print("LevelBset on "+DoubleToStr(LBuy,5));
}
}
}
///////////////////////////////LBuyCheckExp/////////////////////////////////void CkExpLBuy ()
{
if(LevelBset==true)
{
if(Close[2]<LBuy && Close[1]<LBuy)
{
LevelBset=false;
Print (DoubleToStr(LBuy,5)+" expired - close");
}
}
}
//////////////////////CHECK TRIGGER/////////////////////void CheckTrigger()
{
//Trigger1if (UseTrigger1)
{
if (Low[2]>LBuy && Low[1]<LBuy && Close[1]>LBuy)
{
TriggerBuy1=true;
Alert("Tbuy1 ON");
}
else
TriggerBuy1=false;
if (High[2]<LSell && High[1]>LSell && Close[1]<LSell)
{
TriggerSell1=true;
Alert("TSeLL1 ON");
}
else
TriggerSell1=false;
}
else
{
TriggerBuy1=false;
TriggerSell1=false;
}
//Trigger2 if (UseTrigger2)
{
if (Low[3]>LBuy && Low[2]<LBuy && Close[2]<LBuy && Close[1]>LBuy)
{
TriggerBuy2=true;
Alert("Tbuy2 ON");
}
else
TriggerBuy2=false;
if (High[3]<LSell && High[2]>LSell && Close[2]>LSell && Close[1]<LSell)
TriggerSell2=true;
else
TriggerSell2=false;
}
else
{
TriggerBuy2=false;
TriggerSell2=false;
}
CheckOpen();
}
//////////////////////////////////CheckOpen///////////////////////////////////void CheckOpen()
{
if (TriggerBuy1)
{
SL=Low[1]-AddToSL*Point;
if ( (Open[0]-SL)/Point<=MaxSL && (Open[0]-SL)/Point>=MinSL)
{
Print("Trigger1: SL" +DoubleToStr(SL,0)+ "under"+ DoubleToStr(MaxSL,0)+ " pips");
OpenTrade(1,"Trigger1");
}
if ( (Open[0]-SL)/Point<=MaxSL && (Open[0]-SL)/Point<MinSL)
{
SL=Open[0]-MinSL*Point;
Print("Trigger1: SL minimum"+ DoubleToStr(MinSL,0)+ "pips, SL="+DoubleToStr(SL,5));
OpenTrade(1,"Trigger1");
}
if ( (Open[0]-SL)/Point>MaxSL)
{
Print("Trigger1: SL not taken because difference is ",DoubleToStr((Open[0]-SL)/Point,0));
AlternativeEntryB=true;
AlternativeEntryBTime=Time[0];
}
}
if (TriggerSell1)
{
SL=High[1]+AddToSL*Point;
SL=SL+MathAbs(Ask-Bid);
if ( (SL-Open[0])/Point<=MaxSL && (SL-Open[0])/Point>=MinSL)
{
Print("Trigger1: SL"+ DoubleToStr(SL,0)+ "under"+ DoubleToStr(MaxSL,0)+ "pips");
OpenTrade(2,"Trigger1");
}
if ( (SL-Open[0])/Point<=MaxSL && (SL-Open[0])/Point<MinSL)
{
SL=Open[0]+MinSL*Point+MathAbs(Ask-Bid);
Print("Trigger1: SL minimum"+ DoubleToStr(MinSL,0)+ "pips, SL="+DoubleToStr(SL,5));
OpenTrade(2,"Trigger1");
}
if ( (SL-Open[0])/Point<=MaxSL)
{
Print("Trigger1: SL not taken because difference is ",DoubleToStr((SL-Open[0])/Point,0));
AlternativeEntryS=true;
AlternativeEntrySTime=Time[0];
}
}
if (TriggerBuy2)
{
SL=Low[iLowest(NULL,0,MODE_LOW,3,1)]-AddToSL*Point;
if ( (Open[0]-SL)/Point<=MaxSL && (Open[0]-SL)/Point>=MinSL)
{
Print("Trigger2: SL"+ DoubleToStr(SL,0)+ "under"+ DoubleToStr(MaxSL,0)+ "pips");
OpenTrade(1,"Trigger2");
}
if ( (Open[0]-SL)/Point<=MaxSL && (Open[0]-SL)/Point<MinSL)
{
SL=Open[0]-MinSL*Point;
Print("Trigger2: SL minimum"+ DoubleToStr(MinSL,0)+ " pips, SL="+DoubleToStr(SL,5));
OpenTrade(1,"Trigger2");
}
if ( (Open[0]-SL)/Point>MaxSL)
{
Print("Trigger2: SL not taken because difference is ",DoubleToStr((Open[0]-SL)/Point,0));
AlternativeEntryB=true;
AlternativeEntryBTime=Time[0];
}
}
if (TriggerSell2)
{
SL=High[iHighest(NULL,0,MODE_HIGH,3,1)]+AddToSL*Point;
SL=SL+MathAbs(Ask-Bid);
if ( (SL-Open[0])/Point<=MaxSL && (SL-Open[0])/Point>=MinSL)
{
Print("Trigger2: SL"+ DoubleToStr(SL,0)+ "under"+ DoubleToStr(MaxSL,0)+ "pips");
OpenTrade(2,"Trigger2");
}
if ( (SL-Open[0])/Point<=MaxSL && (SL-Open[0])/Point<MinSL)
{
SL=Open[0]+MinSL*Point+MathAbs(Ask-Bid);
Print("Trigger2: SL minimum"+ DoubleToStr(MinSL,0)+ "pips, SL="+DoubleToStr(SL,5));
OpenTrade(2,"Trigger2");
}
if ( (SL-Open[0])/Point<=MaxSL)
{
Print("Trigger2: SL not taken because difference is ",DoubleToStr((SL-Open[0])/Point,0));
AlternativeEntryS=true;
AlternativeEntrySTime=Time[0];
}
}
}
//////////////////////////////////////////Open Trade//////////////////////////////////////////////void OpenTrade(int dir,string trigger)
{
ticketBuy=0;
ticketSell=0;
if (dir==1)
{
Print(trigger, " - Opening BUY");
TP=Ask+TakeProfit*Point;
ticketBuy=OrderSend(Symbol(),OP_BUY,lot,Ask,Slippage,SL,TP,trigger,MagicNumber,0,Blue);
}
if (dir==2)
{
Print(trigger, " - Opening SELL");
TP=Bid-TakeProfit*Point;
ticketSell=OrderSend(Symbol(),OP_SELL,lot,Bid,Slippage,SL,TP,trigger,MagicNumber,0,Red);
}
if (ticketBuy>0)
{
Print("Deleting - Buy Level", DoubleToStr(LBuy,5));
LevelBset=false;
}
if (ticketSell>0)
{
Print("Deleting - Sell Level", DoubleToStr(LSell,5));
LevelSset=false;
}
}
Я не могу сделать условие истечения времени для ценового уровня. Как я уже говорил, если цена остается ниже LSell или выше LBuy более чем на 96 свечей, чтобы отклонить этот ценовой уровень.
Я пытался использовать if(Time[high_bar]<Time[96]) && LevelSset=true.... set LevelSset to false... но похоже это не работает.... void CkExpLSell ()... я уверен, что делаю что-то не так, но... я понятия не имею что, так что помогите пожалуйста :)
ObjectCreate("olive "+Time[0]
имя строки говорит о моменте ее создания.
Я уже давал вам в этой теме, как проверить, используя имя строки, как проверить истечение времени.
int Bar96 = 96 * Period() * 60;
:
if (Time[0] - Bar96 > SetBar && ObjectGet(Name, OBJPROP_ARROWCODE) == 242)
Это предполагает, что на графике нет пропущенных баров, как в M1, когда нет тиков в минуту, или все ТФ меньше недельных за конец недели. Не предполагайте, упрощайте:
96 баров назад
// int Bar96 = 96 * Period() * 60;
:
if (Time[96] > SetBar && ObjectGet(Name, OBJPROP_ARROWCODE) == 242)
на тестере стратегий все выглядит нормально. затем я поставил советник на демо-счета разных платформ, и он работал (устанавливая уровни цен и совершая сделки, как и ожидалось), пока не появилась эта ошибка.
я меняю период тестирования в тестере стратегий, и я получаю ту же ошибку... не имеет значения, если это LevelBset или LevelSset, советник устанавливает уровень по правильной цене, тогда уровень цены изменяется на 0,0000.
я не нашел ошибку до сих пор, поэтому, пожалуйста, проверьте мой код.
спасибо за помощь.
//+------------------------------------------------------------------+//| 3expert.mq4 |//| ant |//| |//+------------------------------------------------------------------+#property copyright"ant"#property link""externbool UseTrigger1= true ;
externbool UseTrigger2= true ;
externint Kperiod = 80 ;
externint Dperiod = 30 ;
externint Stochshift = 30 ;
externint AddToSL= 0 ;
externint MinSL= 50 ;
externint MaxSL= 100 ;
externint TakeProfit= 50 ;
externint Slippage= 0 ;
externdouble lot= 1 ;
int MagicNumber= 777 ;
/*extern int Startday=1;
extern int Starthour=0;
extern int Startminute=30;
extern int Endday=5;
extern int Endhour=20;
extern int Closehour=20;
bool Weekend=false;*/bool TriggerBuy1= false ;
bool TriggerBuy2= false ;
bool TriggerSell1= false ;
bool TriggerSell2= false ;
bool LevelBset= false ;
bool LevelSset= false ;
double LevelB,LevelS;
double ticketBuy,ticketSell;
double SL,TP;
double stoch;
double LBuy;
double LSell;
int high_bar,low_bar;
bool AlternativeEntryB= false ;
datetime AlternativeEntryBTime;
bool AlternativeEntryS= false ;
datetime AlternativeEntrySTime;
//+------------------------------------------------------------------+//| expert initialization function |//+------------------------------------------------------------------+int init()
{
//----//----return ( 0 );
}
//+------------------------------------------------------------------+//| expert deinitialization function |//+------------------------------------------------------------------+int deinit()
{
//----//----return ( 0 );
}
//+------------------------------------------------------------------+//| expert start function |//+------------------------------------------------------------------+int start()
{
//if (TradingHours())if (WeClose())
return ( 0 );
stoch= iStochastic ( NULL , 0 ,Kperiod,Dperiod,Stochshift, MODE_SMA , 1 , MODE_MAIN , 0 );
SellLevelSet();
BuyLevelSet();
if ( OrdersTotal ()== 0 )
{
CheckRecoveryTrade();
CheckAlternativeEntry();
}
if (LevelSset== true || LevelBset== true )
{
if (IsNewBar ())
{
CkExpLSell ();
CkExpLBuy ();
CkExpTime();
CheckTrigger();
}
}
//----return ( 0 );
}
//+------------------------------------------------------------------+////////////////////////////TradingHours//////////////////////////////bool WeClose ()
{
if ( DayOfWeek ()== 0 || DayOfWeek ()== 6 )
{ LevelSset= false ;
del242();
LevelBset= false ;
del241();
return ( true );
}
else
{ return ( false );}
}
////////////////////////////IsNewCandle///////////////////////////////bool IsNewBar ()
{
int BarsOnChart;
if ( Bars ==BarsOnChart)
return ( false );
BarsOnChart = Bars ;
return ( true );
}
/////////////////////////////LSell Setup////////////////////////////////void SellLevelSet()
{
if (stoch> 75 && LevelSset== false )
{
LSell= High [ iHighest ( NULL , 0 , MODE_HIGH , 34 , 2 )];
high_bar= iHighest ( NULL , 0 , MODE_HIGH , 34 , 2 );
if ( Bid <LSell && High [ 0 ]<LSell && High [ 1 ]<LSell)
{
if ( Time [high_bar]> TimeCurrent ()- 10800 )
{
ObjectCreate ( "tomato " + Time [high_bar], OBJ_ARROW , 0 , Time [high_bar],LSell+ Point * 20 );
ObjectSet ( "tomato " + Time [high_bar], OBJPROP_ARROWCODE , 242 );
ObjectSet ( "tomato " + Time [high_bar], OBJPROP_COLOR ,Tomato);
LevelSset= true ;
Print ( "LevelSset on " + DoubleToStr (LSell, 5 ));
}
}
}
}
///////////////////////////////Object Delete////////////////////////////////void del242 ()
{
string Name;
double SetBar;
for ( int i = 0 ; i < ObjectsTotal (); i++)
{
Name= ObjectName (i);
SetBar = ObjectGet (Name, OBJPROP_TIME1 );
if ( ObjectGet (Name, OBJPROP_ARROWCODE ) == 242 )
{
ObjectDelete (Name);
}
}
}
void del241 ()
{
string Name;
double SetBar;
for ( int i = 0 ; i < ObjectsTotal (); i++)
{
Name= ObjectName (i);
SetBar = ObjectGet (Name, OBJPROP_TIME1 );
if ( ObjectGet (Name, OBJPROP_ARROWCODE ) == 241 )
{
ObjectDelete (Name);
}
}
}
///////////////////////////////LSellCheckExp/////////////////////////////////void CkExpLSell ()
{
if ( Close [ 2 ]>LSell && Close [ 1 ]>LSell) //LSell expires after two bars close over
{
LevelSset= false ;
Print ( DoubleToStr (LSell, 5 )+ " expired - close" );
del242 ();
}
}
////////////////////////////////96BarExp//////////////////////////////void CkExpTime ()
{
int Bar96 = iBarShift ( NULL , 0 , Time [ 0 ]- 96 * Period ()* 60 );
string Name;
double SetBar;
for ( int i = 0 ; i < ObjectsTotal (); i++)
{
Name= ObjectName (i);
SetBar = ObjectGet (Name, OBJPROP_TIME1 );
if ( Time [Bar96] > SetBar && ObjectGet (Name, OBJPROP_ARROWCODE ) == 242 )
{
LevelSset = false ;
Print ( DoubleToStr (LSell, 5 )+ " expired - time" );
ObjectDelete (Name);
}
if ( Time [Bar96] > SetBar && ObjectGet (Name, OBJPROP_ARROWCODE ) == 241 )
{
LevelBset = false ;
Print ( DoubleToStr (LBuy, 5 )+ " expired - time" );
ObjectDelete (Name);
}
}
}
/////////////////////////////LBuy Setup////////////////////////////////void BuyLevelSet()
{
if (stoch< 25 && LevelBset== false )
{
LBuy= Low [ iLowest ( NULL , 0 , MODE_LOW , 34 , 2 )];
low_bar= iLowest ( NULL , 0 , MODE_LOW , 34 , 2 );
if ( Bid >LBuy && Low [ 0 ]>LBuy && Low [ 1 ]>LBuy)
{
if ( Time [low_bar]> TimeCurrent ()- 10800 )
{
ObjectCreate ( "olive " + Time [low_bar], OBJ_ARROW , 0 , Time [low_bar],LBuy- Point * 20 );
ObjectSet ( "olive " + Time [low_bar], OBJPROP_ARROWCODE , 241 );
ObjectSet ( "olive " + Time [low_bar], OBJPROP_COLOR ,Olive);
LevelBset= true ;
Print ( "LevelBset on " + DoubleToStr (LBuy, 5 ));
}
}
}
}
///////////////////////////////LBuyCheckExp/////////////////////////////////void CkExpLBuy ()
{
if ( Close [ 2 ]<LBuy && Close [ 1 ]<LBuy)
{
LevelBset= false ;
Print ( DoubleToStr (LBuy, 5 )+ " expired - close" );
del241();
}
}
//////////////////////CHECK TRIGGER/////////////////////void CheckTrigger()
{
//Trigger1if (UseTrigger1)
{
if ( Low [ 2 ]>LBuy && Low [ 1 ]<LBuy && Close [ 1 ]>LBuy)
{
TriggerBuy1= true ;
Print ( "Tbuy1 ON" );
del241();
}
else
TriggerBuy1= false ;
if ( High [ 2 ]<LSell && High [ 1 ]>LSell && Close [ 1 ]<LSell)
{
TriggerSell1= true ;
Print ( "TSeLL1 ON" );
del242();
}
else
TriggerSell1= false ;
}
else
{
TriggerBuy1= false ;
TriggerSell1= false ;
}
//Trigger2 if (UseTrigger2)
{
if ( Low [ 3 ]>LBuy && Low [ 2 ]<LBuy && Close [ 2 ]<LBuy && Close [ 1 ]>LBuy)
{
TriggerBuy2= true ;
Print ( "Tbuy2 ON" );
del241();
}
else
TriggerBuy2= false ;
if ( High [ 3 ]<LSell && High [ 2 ]>LSell && Close [ 2 ]>LSell && Close [ 1 ]<LSell)
{
TriggerSell2= true ;
Print ( "TSeLL2 ON" );
del242();
}
else
TriggerSell2= false ;
}
else
{
TriggerBuy2= false ;
TriggerSell2= false ;
}
CheckOpen();
}
//////////////////////////////////CheckOpen///////////////////////////////////void CheckOpen()
{
if (TriggerBuy1)
{
SL= Low [ 1 ]-AddToSL* Point ;
if ( ( Ask -SL)/ Point <=MaxSL && ( Ask -SL)/ Point >=MinSL)
{
Print ( "Trigger1: SL" + DoubleToStr (SL, 0 )+ "under" + DoubleToStr (MaxSL, 0 )+ " pips" );
OpenTrade( 1 , "Trigger1" );
}
if ( ( Ask -SL)/ Point <=MaxSL && ( Ask -SL)/ Point <MinSL)
{
SL= Ask -MinSL* Point ;
Print ( "Trigger1: SL minimum " + DoubleToStr (MinSL, 0 )+ " pips, SL=" + DoubleToStr (SL, 5 ));
OpenTrade( 1 , "Trigger1" );
}
if ( ( Ask -SL)/ Point >MaxSL)
{
Print ( "Trigger1: SL not taken because difference is " , DoubleToStr (( Open [ 0 ]-SL)/ Point , 0 ));
AlternativeEntryB= true ;
AlternativeEntryBTime= Time [ 0 ];
}
}
if (TriggerSell1)
{
SL= High [ 1 ]+AddToSL* Point ;
SL=SL+ MathAbs ( Ask - Bid );
if ( (SL- Open [ 0 ])/ Point <=MaxSL && (SL- Open [ 0 ])/ Point >=MinSL)
{
Print ( "Trigger1: SL" + DoubleToStr (SL, 0 )+ "under" + DoubleToStr (MaxSL, 0 )+ "pips" );
OpenTrade( 2 , "Trigger1" );
}
if ( (SL- Open [ 0 ])/ Point <=MaxSL && (SL- Open [ 0 ])/ Point <MinSL)
{
SL= Open [ 0 ]+MinSL* Point ;
Print ( "Trigger1: SL minimum" + DoubleToStr (MinSL, 0 )+ "pips, SL=" + DoubleToStr (SL, 5 ));
OpenTrade( 2 , "Trigger1" );
}
if ( (SL- Open [ 0 ])/ Point >MaxSL)
{
Print ( "Trigger1: SL not taken because difference is " , DoubleToStr ((SL- Open [ 0 ])/ Point , 0 ));
AlternativeEntryS= true ;
AlternativeEntrySTime= Time [ 0 ];
}
}
if (TriggerBuy2)
{
SL= Low [ iLowest ( NULL , 0 , MODE_LOW , 3 , 1 )]-AddToSL* Point ;
if ( ( Ask -SL)/ Point <=MaxSL && ( Ask -SL)/ Point >=MinSL)
{
Print ( "Trigger2: SL" + DoubleToStr (SL, 0 )+ "under" + DoubleToStr (MaxSL, 0 )+ "pips" );
OpenTrade( 1 , "Trigger2" );
}
if ( ( Ask -SL)/ Point <=MaxSL && ( Ask -SL)/ Point <MinSL)
{
SL= Open [ 0 ]+ MathAbs ( Ask - Bid )-MinSL* Point ;
Print ( "Trigger2: SL minimum " + DoubleToStr (MinSL, 0 )+ " pips, SL=" + DoubleToStr (SL, 5 ));
OpenTrade( 1 , "Trigger2" );
}
if ( ( Ask -SL)/ Point >MaxSL)
{
Print ( "Trigger2: SL not taken because difference is " , DoubleToStr (( Open [ 0 ]-SL)/ Point , 0 ));
AlternativeEntryB= true ;
AlternativeEntryBTime= Time [ 0 ];
}
}
if (TriggerSell2)
{
SL= High [ iHighest ( NULL , 0 , MODE_HIGH , 3 , 1 )]+AddToSL* Point ;
SL=SL+ MathAbs ( Ask - Bid );
if ( (SL- Open [ 0 ])/ Point <=MaxSL && (SL- Open [ 0 ])/ Point >=MinSL)
{
Print ( "Trigger2: SL" + DoubleToStr (SL, 0 )+ "under" + DoubleToStr (MaxSL, 0 )+ "pips" );
OpenTrade( 2 , "Trigger2" );
}
if ( (SL- Open [ 0 ])/ Point <=MaxSL && (SL- Open [ 0 ])/ Point <MinSL)
{
SL= Open [ 0 ]+MinSL* Point ;
Print ( "Trigger2: SL minimum" + DoubleToStr (MinSL, 0 )+ "pips, SL=" + DoubleToStr (SL, 5 ));
OpenTrade( 2 , "Trigger2" );
}
if ( (SL- Open [ 0 ])/ Point >MaxSL)
{
Print ( "Trigger2: SL not taken because difference is " , DoubleToStr ((SL- Open [ 0 ])/ Point , 0 ));
AlternativeEntryS= true ;
AlternativeEntrySTime= Time [ 0 ];
}
}
}
//////////////////////////////////////////Open Trade//////////////////////////////////////////////void OpenTrade( int dir, string trigger)
{
ticketBuy= 0 ;
ticketSell= 0 ;
if ( OrdersTotal ()== 0 )
{
if (dir== 1 )
{
Print (trigger, " - Opening BUY" );
TP= Ask +TakeProfit* Point ;
ticketBuy= OrderSend ( Symbol (), OP_BUY ,lot, Ask ,Slippage,SL,TP,trigger,MagicNumber, 0 ,Blue);
}
if (dir== 2 )
{
Print (trigger, " - Opening SELL" );
TP= Bid -TakeProfit* Point ;
ticketSell= OrderSend ( Symbol (), OP_SELL ,lot, Bid ,Slippage,SL,TP,trigger,MagicNumber, 0 ,Red);
}
if (ticketBuy> 0 )
{
Print ( "Deleting - Buy Level" , DoubleToStr (LBuy, 5 ));
LevelBset= false ;
}
if (ticketSell> 0 )
{
Print ( "Deleting - Sell Level" , DoubleToStr (LSell, 5 ));
LevelSset= false ;
}
}
}
///////////////////////////CHECK ALTERNATIVE ENTRY////////////////////////////void CheckAlternativeEntry()
{
if (AlternativeEntryB)
{
if ( Time [ 0 ]-AlternativeEntryBTime>= Time [ 0 ]- Time [ 17 ])
{
AlternativeEntryB= false ;
del241();
}
}
if (AlternativeEntryS)
{
if ( Time [ 0 ]-AlternativeEntrySTime>= Time [ 0 ]- Time [ 17 ])
{
AlternativeEntryS= false ;
del242();
}
}
if (AlternativeEntryB)
{
if ( ( Ask -SL) / Point <= 70 )
{
Print ( "Trigger: SL under 7 pips" );
OpenTrade( 1 , "Trigger" );
AlternativeEntryB= false ;
}
}
if (AlternativeEntryS)
{
if ( (SL- Bid ) / Point <= 70 )
{
Print ( "Trigger: SL under 7 pips" );
OpenTrade( 2 , "Trigger" );
AlternativeEntryS= false ;
}
}
}
////////////////////////////CHECK RECOVERY TRADE/////////////////////void CheckRecoveryTrade()
{
OrderSelect ( OrdersHistoryTotal ()- 1 , SELECT_BY_POS , MODE_HISTORY );
double Loss= MathAbs ( OrderOpenPrice ()- OrderClosePrice ());
if ( OrderStopLoss ()== OrderClosePrice ())
{
if ( OrderCloseTime ()< Time [ 0 ] && OrderCloseTime ()>= Time [ 1 ])
{
if ( OrderType ()== OP_BUY )
{
if ( Close [ 1 ]> OrderStopLoss ())
{
SL= Low [ 1 ]-AddToSL* Point ;
if (( Ask -SL)/ Point <= 100 )
{
Print ( "Recovery BUY" );
TP= Ask +Loss;
OrderSend ( Symbol (), OP_BUY ,lot, Ask ,Slippage,SL,TP, "recovery" ,MagicNumber, 0 ,Olive);
}
}
}
if ( OrderType ()== OP_SELL )
{
if ( Close [ 1 ]< OrderStopLoss ())
{
SL= High [ 1 ]+AddToSL* Point ;
SL=SL+ MathAbs ( Ask - Bid );
if ( (SL- Open [ 0 ])/ Point <= 100 )
{
Print ( "Recovery SELL" );
TP= Bid -Loss;
OrderSend ( Symbol (), OP_SELL ,lot, Bid ,Slippage,SL,TP, "recovery" ,MagicNumber, 0 ,Pink);
}
}
}
}
}
}
какие-нибудь идеи, что не так... кто-нибудь?
спасибо
После создания объекта ....
... вы не можете создать его снова, он уже существует... вместо этого проверьте, существует ли он, и если да, не пытайтесь создать его снова, просто переместите его с помощью ObjectSet().
Я использовал разные имена для каждой свечи, поэтому проблем с объектом не было.
Я переписал его так, и теперь он работает идеально:
устанавливает уровень продажи, и если я получаю два закрытия выше этого уровня -> LevelSset=false -> начинает поиск следующего LSell.
привет, нужна помощь.
Я не могу сделать условие истечения времени для ценового уровня. Как я уже говорил, если цена остается ниже LSell или выше LBuy более чем на 96 свечей, чтобы отклонить этот ценовой уровень.
Я пытался использовать if(Time[high_bar]<Time[96]) && LevelSset=true.... set LevelSset to false... но похоже это не работает.... void CkExpLSell ()... я уверен, что делаю что-то не так, но... я понятия не имею что, так что помогите пожалуйста :)
привет, нужна помощь.
Я не могу сделать условие истечения времени для ценового уровня. Как я уже говорил, если цена остается ниже LSell или выше LBuy более чем на 96 свечей, чтобы отклонить этот ценовой уровень.
Я пытался использовать if(Time[high_bar]<Time[96]) && LevelSset=true.... set LevelSset to false... но похоже это не работает.... void CkExpLSell ()... я уверен, что делаю что-то не так, но... я понятия не имею что, так что помогите пожалуйста :)
имя строки говорит о моменте ее создания.
Я уже давал вам в этой теме, как проверить, используя имя строки, как проверить истечение времени.
и я не вижу, что вы используете этот метод!!!
Ваш индикатор не может делать торговые функции !!!!!!!!........
Сделайте советника, если вы делаете OrderSend
название линии говорит вам о моменте ее создания
я уже давал вам в этой теме как проверить по имени строки способ проверки на истечение времени
и я не вижу, что вы используете этот метод !!!
@ deVries ObjectGet(Name, OBJPROP_TIME1) даже лучше, не нужно лишнего кода (StringSubstr() StrToTime())
Привет, народ,
на тестере стратегий все выглядит нормально. затем я поставил советник на демо-счета разных платформ, и он работал (устанавливая уровни цен и совершая сделки, как и ожидалось), пока не появилась эта ошибка.
я меняю период тестирования в тестере стратегий, и я получаю ту же ошибку... не имеет значения, если это LevelBset или LevelSset, советник устанавливает уровень по правильной цене, тогда уровень цены изменяется на 0,0000.
я не нашел ошибку до сих пор, поэтому, пожалуйста, проверьте мой код.
спасибо за помощь.