[存档!]任何菜鸟问题,为了不给论坛添乱。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 2. - 页 497

 
请告知如何在一个新栏 上只开一次单 ????
 

在EA中嵌入代码,我有这样的东西,直到我删除它,我使用的是每小时的时间框架

orderselect- 选择历史上的最后一个订单。

取其关门的时间,拉出关门的时间

在打开订单之前,设置一个条件,即当前小时不等于历史上的订单关闭时间。

 

请帮助我解决这个问题,我的TP变量 在第二次价格更新后变成了零,也就是说,顾问开了一个订单,TP和Bid都不等于零,然后价格再次更新,TP是零,虽然这不在代码中,我在拉升SL方面有问题,但现在发现问题出在TP的定义上


int start()
{
//----
double TP;
double SL;
if (OrdersTotal()==0)
{
OrderSend(Symbol(),OP_BUY,0.01,Ask,3,0,Bid+4*Point);
OrderSelect(OrdersTotal() -1,SELECT_BY_POS);
} TP=OrderTakeProfit()
Alert ("TP=" + TP);
Alert ("Bid=" + Bid);
if (OrdersTotal()>0)
{
if (TP-Bid<3*Point)
{
Alert (" Approaching TP by 1 or 2");
Alert ("TP=" + TP);
Alert ("Bid=" + Bid);
}
}
//----
return(0);
} }

 
LazarevDenis:

请帮助我解决这个问题,我的TP变量在第二次价格更新后被清零,也就是说,EA开了一个订单,显示TP和Bid的值,两者都不等于零,然后价格再次更新,TP为零,虽然在代码中,没有这样的命令,我在拉升SL时有问题,但现在发现,问题出在TP的定义上。

double TP, SL;


int start()
{
//----

if (OrdersTotal()==0)
{
OrderSend(Symbol(),OP_BUY,0.01,Ask,3,0,Bid+4*Point);
OrderSelect(OrdersTotal()-1,SELECT_BY_POS);
TP=OrderTakeProfit();
}
Alert ("TP=" + TP);
Alert ("Bid=" + Bid);
if (OrdersTotal()>0)
{
if (TP-Bid<3*Point)
{
Alert ("Приблизился к ТП на 1 или 2");
Alert ("TP=" + TP);
Alert ("Bid=" + Bid);
}
}
//----
return(0);
}
这样试一下...
 
VOLDEMAR:
请告知如何在一个新栏上只开一次单 ????

在此阅读:https://www.mql5.com/ru/forum/134437
 
Cmu4,非常感谢你,你对我帮助很大。
 

大家好!

策略中有两个信号:一个主信号和一个次信号。当第二个信号出现不超过12小时后,交易就开始了。问题:我怎样才能教我的专家顾问不对信号作出反应,如果它在12小时后出现?如果你能给出一个具体的代码例子,请你

 
demlin:

大家好!

策略中有两个信号:一个主信号和一个次信号。当第二个信号出现不超过12小时后,交易就开始了。问题:我怎样才能教我的专家顾问不对信号作出反应,如果它在12小时后出现?如果你能给我一个代码的例子,请你


嗨,德米特里。就我而言,我准备向你提供以下变体。打个比方,请看 本文的 交易标准的触发--也有两个信号--即--见第二张图后 "在德玛西亚图上首先要等待的是德玛西亚在0.7左右穿越快慢MA线的时刻,以便做空。这是第一个初步信号。然后我们等待MA线本身的跨越。这是主信号,之后可以进行太极指标读数。如果MA线没有交叉,则被认为是错误的信号,价格运动将继续进行。 以下是在我的代码中如何实现的--在包含的猫头鹰中,负责触发交易标准。

主要的诀窍是通过在一个或另一个交易标准被触发时设置和重置标志,来完成下面两个(在结束时)的包含工作。

//--------------------------------------------------------------------
// Criterion.mqh
// 
//--------------------------------------------------------------- 1 --
// Функция вычисления торговых критериев.
// Возвращаемые значения:
// 10 - открытие Buy  
// 20 - открытие Sell 
// 0  - значимых критериев нет
// 
//--------------------------------------------------------------- 2 --
// Внешние переменные:
extern string A5 = "Параметры";
//extern int       Period_K = 5;            // Период K
//extern int       Period_D = 3;            // Период D
//extern int       Slowing = 3;             // Замедление

extern int Tenkan=9;
extern int Kijun=26;
extern int Senkou=52;
extern int FlatSE=7;

extern int DeMarker=25;
extern int FastMA=14;
extern int SlowMA=25;
extern double DeMarker_OpenLevel_Sell = 0.7;
extern double DeMarker_OpenLevel_Buy = 0.7;
 bool   DeMarker_Buy_signal=false, DeMarker_Sell_signal=false,
       MA_Buy_signal=false, MA_Sell_signal=false;



extern int t_trend_period =6; // для оптимизации по всем периодам от 0 до 7 шаг 1
                              // на каком ТФ работаем: 1-М1, 2-М5, 3-М15, 4-М30, 5-Н1, 6 - Н4, 7-день
 

//--------------------------------------------------------------- 3 --
int Criterion()                        // Пользовательская функция
  {
  //--------------------------------------------------------------- 4 --
 int trend_period=GetPeriod(t_trend_period); // для выбора оптимального значения рабочего ТФ

   // Параметры технич. индикат:
                 
double Taichi_1 = iCustom (Symbol(), trend_period, "Cronex Taichi",Tenkan, Kijun, Senkou, FlatSE, 0, 1);
double TaichiFor_1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 3, 1);
double Signal_1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 1, 1);
double SSignal_1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 2, 1);

double FlatBuffer1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 4, 1);
double FlatBuffer2 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 5, 1);

double DeMarker_1 = iCustom (Symbol(), trend_period, "Cronex DeMarker",DeMarker, FastMA, SlowMA, 0, 1);
double DeMarker_2 = iCustom (Symbol(), trend_period, "Cronex DeMarker",DeMarker, FastMA, SlowMA, 0, 2);

double FastMA_1 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 1, 1);
double FastMA_2 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 1, 2);

double SlowMA_1 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 2, 1);
double SlowMA_2 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 2, 2);

//--------------------------------------------------------------- 5 --
   // Вычисление торговых критериев
   
   if(( (type_op_DeMarker(DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_BUY) || (DeMarker_Buy_signal == true && DeMarker_Sell_signal==false)) &&  // когда DeMarker пересекает медленую (выше уровня бай (0.7)) для лонг
      ( (type_op_MA (DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_BUY) || (MA_Buy_signal==true && MA_Sell_signal==false)) && // пересечение МА DeMarkers
   
   
      (iClose(Symbol(), trend_period,1) > Taichi_1 && Taichi_1 > TaichiFor_1 && Signal_1 > SSignal_1 && FlatBuffer1==0 && FlatBuffer2==0))
     
         {
           Print ("Taichi_1 = ", Taichi_1, "TaichiFor_1 = ",TaichiFor_1, "Signal_1 = ", Signal_1, "SSignal_1 = ",SSignal_1, "FlatBuffer1 = ", FlatBuffer1, "FlatBuffer2 = ", FlatBuffer2);
           Print ("DeMarker_1 = ", DeMarker_1, "DeMarker_2 = ",DeMarker_2, "FastMA_1 = ", FastMA_1, "FastMA_2 = ",FastMA_2, "SlowMA_1 = ", SlowMA_1, "SlowMA_2 = ", SlowMA_2);
           return(10);                      // Открытие Buy    
         }
        
   if(( (type_op_DeMarker(DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_SELL) || (DeMarker_Buy_signal==false && DeMarker_Sell_signal==true)) &&  // когда DeMarker пересекает медленую (ниже уровня селл) для шорт
      ( (type_op_MA (DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_SELL) || (MA_Buy_signal==false && MA_Sell_signal==true)) && // пересечение МА DeMarkers
        
      (iClose(Symbol(), trend_period,1) < Taichi_1 && Taichi_1 < TaichiFor_1 && Signal_1 < SSignal_1 && FlatBuffer1==0 && FlatBuffer2==0))
        {
           Print ("Taichi_1 = ", Taichi_1, "TaichiFor_1 = ",TaichiFor_1, "Signal_1 = ", Signal_1, "SSignal_1 = ",SSignal_1, "FlatBuffer1 = ", FlatBuffer1, "FlatBuffer2 = ", FlatBuffer2);
           Print ("DeMarker_1 = ", DeMarker_1, "DeMarker_2 = ",DeMarker_2, "FastMA_1 = ", FastMA_1, "FastMA_2 = ",FastMA_2, "SlowMA_1 = ", SlowMA_1, "SlowMA_2 = ", SlowMA_2);
           return(20);  
        }                       // Открытие Sell 
  
//--------------------------------------------------------------- 6 --
   return(0);                          // Выход из пользов. функции
  }
//--------------------------------------------------------------- 7 --

//для оптимизации по всем ТФ
int GetPeriod(int period)
{int periodres;
 switch(period)
  {
   case 1: periodres=1;break;
   case 2: periodres=5;break;
   case 3: periodres=15;break;
   case 4: periodres=30;break;
   case 5: periodres=60;break;
   case 6: periodres=240;break;
   case 7: periodres=1440;break;
   case 8: periodres=10080;break;
   default: periodres=1;break;
  }
return(periodres);
} 


int type_op_DeMarker(double D1, double D2, double F1, double F2, double S1,double S2)// Функция - условия для входа в рынок и сохранения их через переменные Buy_signal и Sell_signal (даже после их сработки - до отмены
               // противоположными сигналами)
               
{
      
     if (D2-S2 < 0 && D1-S1 > 0 && D1 > F1  && D1 < DeMarker_OpenLevel_Buy)
          {
             DeMarker_Buy_signal=true;
             DeMarker_Sell_signal=false;
             return(OP_BUY);
          } 
  
      if (D2-S2 > 0 && D1-S1 < 0 && D1 < F1 && D1 > DeMarker_OpenLevel_Sell)                                                                                   
          {
             DeMarker_Buy_signal=false;
             DeMarker_Sell_signal=true;
             return(OP_SELL);
          }   
   else return(-1);
     
}

int type_op_MA(double d1, double d2, double f1, double f2, double s1,double s2) // условия для входа в рынок и сохранения их через переменные Buy_signal и Sell_signal (даже после их сработки - до отмены
               // противоположными сигналами)
               

  {
          
     if (f2 - s2 < 0 && f1 - s1 > 0)
          {
             MA_Buy_signal=true;
             MA_Sell_signal=false;
             return(OP_BUY);
          } 
  
      if (f2-s2 > 0 && f1-s1 < 0)                                                                                                               
          {
             MA_Buy_signal=false;
             MA_Sell_signal=true;
             return(OP_SELL);
          }   
   else return(-1);

  }

当使用TimeCurrent触发主准则时,你将额外保存当前时间,即在return(OP_BUY);或return(OP_SELL);之前指定一个x=TimeCurrent类型的表达式,其中x是在第一个int_op_DeMarker 函数中类比的一个日期时间类型的全局变量。然后对第二个int type_op_MA函数做同样的处理...- 在那里你记住了变量y = TimeCurrent。

然后你在交易标准计算区块中用加号比较这两个变量的值(事实证明,你不需要用UTC值来模拟工作--相反,你采取的是比较收到两个交易信号的时间)。

 // Вычисление торговых критериев
   
   if(( (type_op_DeMarker(DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_BUY) || (DeMarker_Buy_signal == true && DeMarker_Sell_signal==false)) &&  // когда DeMarker пересекает медленую (выше уровня бай (0.7)) для лонг
      ( (type_op_MA (DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_BUY) || (MA_Buy_signal==true && MA_Sell_signal==false)) && // пересечение МА DeMarkers
   
   
      ((x+43200) < y )) //43200 - это количество секунд в 12-ти часах
     
         {
           Print ("Время сработки первого условия х(в секундах) = ", х, " Время сработки второго условия y (в секундах) = ", y);
           Print ("DeMarker_1 = ", DeMarker_1, "DeMarker_2 = ",DeMarker_2, "FastMA_1 = ", FastMA_1, "FastMA_2 = ",FastMA_2, "SlowMA_1 = ", SlowMA_1, "SlowMA_2 = ", SlowMA_2);
           return(10);                      // Открытие Buy    
         }

P.S. 另外,我给你发了一个函数,可以优化工作TF的价值。

P.P.S. 在我的代码中,这个代码结构是这样组织的。我不排除有更好的代码变体来满足EA的这种条件。:-)))

 

我如何在我的EA中计算一个货币对的利润?

例如,我有七个以不同价格买入欧元的订单,我如何计算欧元的利润而不影响其他货币对的订单?????

 

使用SelectOrder来扫描所有未结订单

检查所需的一对(OrderSymbol)。

然后将利润添加到任何变量,如果它是所需的OrderProfit。

这里有一个链接,上面有一些有用的功能https://docs.mql4.com/ru/trading/OrderSelect

在左边有一个包含操作的菜单,所有的操作都在这里描述。