[存档!]任何菜鸟问题,为了不使论坛变得混乱。专业人士,不要路过。没有你,哪里都不能去 - 4. - 页 220

 
alsu:
你说对了。此外,当我们从盒子里取出一个值时,它的类型是double,但如果给出的命令是将结果写入int类型的变量中,编译器会自动采取所有必要的步骤,将该值放入一个新的盒子中。


为了最终确定我的想法是正确的,请查看我对你最后一段的想法......因此,让我们拥有上述的专家。

//--------------------------------------------------------------------
// globalvar.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int    Experts;                                 // Колич. экспертов
double Depo=10000.0,                            // Заданный депозит
       Persent=30,                              // Заданный процент     
       Money;                                   // Искомые средства
string Quantity="GV_Quantity";                  // Имя GV-переменной
//--------------------------------------------------------------------
int init()                                      // Спец. функция init
  {
   Experts=GlobalVariableGet(Quantity);         // Получим тек. знач.
   Experts=Experts+1;                           // Колич. экспертов
   GlobalVariableSet(Quantity, Experts);        // Новое значение
   Money=Depo*Persent/100/Experts;              // Средства для эксп.
   Alert("Для эксперта в окне ", Symbol()," выделено ",Money);
   return;                                      // Выход из init()
  }
//--------------------------------------------------------------------
int start()                                     // Спец. функция start
  {
   int New_Experts= GlobalVariableGet(Quantity);// Новое колич. эксп.
   if (Experts!=New_Experts)                    // Если изменилось
     {
      Experts=New_Experts;                      // Теперь текущ. такое
      Money=Depo*Persent/100/Experts;           // Новое знач. средств 
      Alert("Новое значение для эксперта ",Symbol(),": ",Money);
     }
   /*
   ...
   Здесь долен быть указан основной код эксперта,
   в котором используется значение переменной Money
   ...
   */
   return;                                      // Выход из start()
  }
//--------------------------------------------------------------------
int deinit()                                    // Спец. ф-ия deinit
  {
   if (Experts ==1)                             // Если эксперт один..
      GlobalVariableDel(Quantity);              //..удаляем GV-перемен
   else                                         // А иначе..
      GlobalVariableSet(Quantity, Experts-1);   //..уменьшаем на 1
   Alert("Эксперт выгружен из окна ",Symbol()); // Сообщ. о выгрузке
   return;                                      // Выход из deinit()
  }
//--------------------------------------------------------------------

然后在字符串中。

Experts=GlobalVariableGet(Quantity);         // Получим тек. знач.

我们在 "GV-变量 "框中放入一个整数类型的Experts变量进行存储(将其转换为double类型)。那么,如果(假设)在专家顾问中会有一个字符串

int New_Experts=Experts;

这意味着有一条命令可以将结果写入一个int类型的变量中。在这种情况下,编译器。

*会把double类型的变量的值取出来。

*对Experts变量的值做任何必要的修改。

*将此值分配给变量New_Experts,并...

*将变量New_Experts的值放入一个 "int "框中。

所以变量类型无非是一些值的外部包装/包装吗,所以GV变量不能是字符串类型,因为降级只允许数字值,而字符串 不会被转换为数字

对吗?

提前感谢您的答复。

 
Stells:
什么不是这样 for (f=1;f<Bars;f++) { Price1 = (iClose(Symbol_1,0,0) - iClose(Symbol_1,0,f)) / MarketInfo(Symbol_1, MODE_POINT)Price2 = K*(iClose(Symbol_2,0,0) - iClose(Symbol_2,0,f)) / MarketInfo(Symbol_2, MODE_POINT); Spread = Price1 - Price2; Print ( "Price1="+Price1, " Price2="+Price2);





如果(传播==0){t=f;break;}
} Price12 = (iClose(Symbol_1,0,0) - iClose(Symbol_1,0,t)) / MarketInfo(Symbol_1, MODE_POINT); Price22 = K*(iClose(Symbol_2,0,0) - iClose(Symbol_2,0,t) ) / MarketInfo(Symbol_2, MODE_POINT); Spread2 = Price12 - Price22;





如果(MathAbs(Spread2) >= razdvizka && Spread2 < 0) { 打开交易 }


想固定点差等于零的那一栏,并从它开始控制点差

如果(MathAbs(Spread)<eps) { ........},你仍然需要控制结果--是否找到满足条件的点。IMHO,最好是创建一个单独的函数,例如,像这样

int GetBarNumWithZerroDist(string Smbl1, string Smbl2, double K, double eps=0.00001)
{
int i=1;
double Smb1Cl0 = NrmalizeDouble(iClose(Smbl1,0,0));
double Smb2Cl0 = NrmalizeDouble(iClose(Smbl2,0,0));
double Smb1Pnt = MarketInfo(Smbl1, MODE_POINT);
double Smb2Pnt = MarketInfo(Smbl2, MODE_POINT);
int    mBars   = MathMin(iBars(Smbl1), iBars(Smbl2));

    for (i=1;i<mBars;i++) 
    {
        double Price1 =   (Smb1Cl0 - iClose(Symbol_1,0,i)) / Smb1Pnt;
        double Price2 = K*(Smb1Cl0 - iClose(Symbol_2,0,i)) / Smb2Pnt;
        double Spread = Price1 - Price2; 
        //Print ("Price1="+Price1, " Price2="+Price2);
        if(MathAbs(Spread)< eps) return(i);
    }
    return(-1);
}
 

你好。

你知道在指标中是否有一个#属性,允许指标总是显示同一时期,例如d1?

即使你在MetaTrader中切换时间框架,它也不会改变?

谢谢

------------------------------------------

哦...有多少个前景.....

 

帮助!!!!

如何从脚本中调用该指标,我真的需要它在一个窗口中显示。

 

晚上好!请帮助我对EA代码进行修改。
1.在测试时,一切都很好 - 但在交易时,第一笔交易必须手动打开,停止和采取。我想让EA在价格到达一个新的刻度时自动开始交易。
2.由于在触发止损 的情况下,下一个头寸的开仓量是前一个手数的两倍,手数理论上可以增加到无限大(在我的例子中,最高为51.2),我想限制它(例如0.8),并能够改变阈值。当达到阈值并触发止损时,专家顾问不会断开,而是从0.1重新开始。

//--- input parameters
extern double    Lot=0.1;
extern int       TP=22;
extern int       SL=20;
extern double    K_Martin=2;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
 {
double oop, ocp, osl, otp, ol; 
int Magic = 0;
int closetime= 0,lastorder=0, tip=0;
for(int i=0;i<OrdersHistoryTotal();i++) /* Цикл перебора ордер*/
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue; // Выбираем ордер из истории.
if(OrderMagicNumber()!=Magic) continue;
if(closetime<OrderCloseTime())
{
closetime = OrderCloseTime();
lastorder = OrderTicket();
tip=OrderType();
ol=OrderLots();
}
}
OrderSelect(lastorder,SELECT_BY_TICKET,MODE_HISTORY);
ocp= (OrderClosePrice());
oop= (OrderOpenPrice());
osl= (OrderStopLoss());
otp= (OrderTakeProfit());
ol= (OrderLots());
Print ("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена открытия ОРДЕРА--[",OrderOpenPrice(),"]"); 
Print ("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена закрытия ОРДЕРА--[",OrderClosePrice(),"]");
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==false )
{
if(tip == OP_SELL && osl==ocp) //Ордер SELL закрылся по по SL значит покупаем
{
OrderSend(Symbol(),OP_BUY,ol*K_Martin,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,Blue); /*Если выполняется условие то покупаем*/
}
if(tip == OP_SELL && otp==ocp) //Ордер SELL закрылся по по TP значит продаем
{
OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point, Bid-TP*Point,0,0,0,Red); /*Если выполняется условие то продаем*/ 
} 
if(tip == OP_BUY && osl==ocp) //Ордер BUY закрылся по SL значит продаем
{
OrderSend(Symbol(),OP_SELL,ol*K_Martin,Bid,0,Bid+SL*Point,Bid-TP*Point,0,0,0,Red); /*Если выполняется условие то продаем*/ 
}
if(tip == OP_BUY && otp==ocp) //Ордер BUY закрылся по по TP значит покупаем
{
OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,Blue); /*Если выполняется условие то покупаем*/
} 
}
return(0);
}

 
Top2n:

请给予帮助。我整天都在挣扎,没有任何帮助。

订单在取货时(Main BAY,作为安全网等待卖出)。

在收盘的时候,在没有损失的情况下,在同一个地方又推迟了。

转动这个东西,https://www.mql5.com/ru/code/8846
 
7777877:


为了最终确定我的想法是正确的,请查看我对你最后一段的想法......因此,让我们拥有上述的专家。

然后在字符串中。

我们在 "GV-变量 "框中放入一个整数类型的Experts变量进行存储(将其转换为double类型)。那么,如果(假设)在专家顾问中会有一个字符串

这意味着有一条命令可以将结果写入一个int类型的变量中。在这种情况下,编译器。

*会把double类型的变量的值取出来。

*对Experts变量的值做任何必要的修改。

*将此值分配给变量New_Experts,并...

*将变量New_Experts的值放入一个 "int "框中。

所以,变量类型只不过是一些值的外部包装/包吗,所以GV变量不能是字符串类型,因为降级只允许数字值,而字符串不会被转换为数字。

对吗?

提前感谢您的回答。

并非如此。问题是,Experts变量已经具有int类型,因此,类型转换必须在给它赋值之前进行,也就是说,编译器

* 从盒子里取出一个双倍类型 的值(它在你的程序中没有名字,只是被写到主内存或CPU寄存器中编译器知道的某个地址上)。

*对上述变量的值做了所有必要的修改,并将一个新的值(int类型!)写入专家变量中。

*将这个值(int!类型)分配给New_Experts变量。它们具有相同的类型,所以只是将一个值从一个内存位置复制到另一个内存位置的问题。


P.S. 很高兴看到有的人对自己的行为理解得如此详细。事实上,不开玩笑。保持联系。

 
Andrew1001:

晚上好!请帮助我对EA代码进行修改。
1.在测试时,一切都很好 - 但在交易时,第一笔交易必须手动打开,停止和采取。我想让EA在价格达到一个新的刻度时自动开始交易。
由于在触发止损的情况下,下一个头寸的开仓量是前一个手数的两倍,手数理论上可以增加到无限大(在我的例子中,最高为51.2),我想限制它(例如0.8),并能够改变阈值。当达到阈值并触发止损时,专家顾问不会断开,而是从0.1重新开始。


试试吧。

extern double Lot=0.1,K_Martin=2,porog=0.8;
extern int TP=22,SL=20,Magic=233;
extern bool poz1_up=true;//ваш выбор:1-ая покупка или продажа(false)? 
extern bool Trade=true;//торговля разрешить?
bool fix;int init(){fix=true;return(0);}int deinit(){return(0);}
int start(){double oop,ocp,osl,otp,ol,lotos;int closetime=0,lastorder=0,tip=0;if(!Trade)return(0);
if(poz1_up&&fix){OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);fix=0;}  
if(!poz1_up&&fix){OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);fix=0;}
for(int i=0;i<OrdersHistoryTotal();i++)
  {if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
   if(OrderMagicNumber()!=Magic)continue;
   if(closetime<OrderCloseTime())lastorder=OrderTicket();}
if(OrderSelect(lastorder,SELECT_BY_TICKET,MODE_HISTORY))
  {tip=OrderType();oop=OrderOpenPrice();osl=OrderStopLoss();
   otp=OrderTakeProfit();ol=OrderLots();ocp=OrderClosePrice();}
Print("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена открытия--[",OrderOpenPrice(),
        "]--","цена закрытия--[",OrderClosePrice(),"]--","прибыль--[",OrderProfit(),"]");
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==0)
  {if(tip==OP_SELL){if(osl==ocp){lotos=ol*K_Martin;if(lotos>porog)lotos=Lot; 
     OrderSend(Symbol(),OP_BUY,lotos,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);}
     if(otp==ocp)OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);} 
  if(tip==OP_BUY){if(osl==ocp){lotos=ol*K_Martin;if(lotos>porog)lotos=Lot;
     OrderSend(Symbol(),OP_SELL,lotos,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);} 
  if(otp==ocp)OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);}}return(0);}
//+------------------------------------------------------------------+
 
你好。你能告诉我,我在哪里可以读到如何在测试器中进行交易,我自己?我很感激。
 

大家好。

我有一个脚本,可以关闭所有可用的订单。

我不明白其中的三句话。

如果不难,请把它翻译成俄语,对初学者来说是可以理解的语言。

我学习了教程,但我没有遇到过这么长的逻辑表达。

我所附的脚本。谢谢你。

附加的文件: