新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 982

 
 int x=0;
 int scale_mas[13]={0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096};//объявление массива

 for(int i=0;i < ArraySize(scale_mas);i++){
    if(x == scale_mas[0])x = scale_mas[1];                       //если х=индекс0, то х=индекс1
    if(x >= ArraySize(scale_mas))x = scale_mas[11];              //если х>= размер массива, то х=индекс11
    i=x;
    if(ObjectGetInteger(0, "Button+", OBJPROP_STATE) == false){  //если кнопка "+" нажата
       i=i+1;                                                    //увеличиваем индекс на 1
       ObjectSetInteger(0, "Button+", OBJPROP_STATE,true);}
                        
    x=i;							 //присваиваем х значение последнего индекса
    if(ObjectGetInteger(0, "Button-", OBJPROP_STATE) == false){  //если кнопка "-" нажата
       i=i-1;                                                    //уменьшаем индекс на 1
    ObjectSetInteger(0, "Button-", OBJPROP_STATE,true);}
                            
    x=i;                                                         //присваиваем х значение последнего индекса
 ObjectSetString(0,"=TrendLine",OBJPROP_TEXT,scale_mas[x]);}}    //выводим результат scale_mas[x]
昨天我写了这段代码,它似乎在正常工作,但只有当我用加号按钮到达数组的顶端值时,它才会重置到数组的开头,并再次向上移动数组。我可以在代码中添加或修正什么,以便当它达到数组的顶部值时,进一步点击加号按钮将停止在顶部索引,并且不会重置到数组的底部?或者可以用其他方式简化代码,以实现这种点击按钮的想法?
 
Ivan Revedzhuk:
昨天我写了这段代码,它似乎在正常工作,但只有当我用加号按钮到达数组的顶端值时,它才会重置到数组的开头,并再次向上移动数组。我可以在代码中添加或修正什么,以便当它达到数组的顶部值时,进一步点击加号按钮将停止在顶部索引,并且不会重置到数组的底部?或者可以用其他方式简化代码,以实现这种点击按钮的想法?
if(x >= ArraySize(scale_mas))
 ArraySize(scale_mas)-1;              //если х>= размер массива, то ....

可能是这样。

 
Alexey Viktorov:

我想是的。

也试过了,效果一样

 
Ivan Revedzhuk:

也试过了,效果一样

我没有马上注意到,这个周期是为了什么?

 
Alexey Viktorov:

我没有马上注意到,但这个循环是为了什么?

有什么办法可以不这样做吗?我只是不知道什么是最好的,我只是在做我认为合理的事情。

 
Ivan Revedzhuk:

有什么办法可以不这样做吗?我只是不知道什么是最好的,做我认为合理的事情。

那么,逻辑一定是不同的。按 "+"按钮可以增加数组的索引。达到最大值时,它不会增加,而是保持在最大值。按下按钮--指数下降。达到0,对按压没有反应,保持在指数0上。

还是有其他的想法?

PS; 又是谁贴出了用旗子工作的例子,来回应这个问题并删除了它?你为什么要删除它?毕竟,这确实是一个解决男人问题的好办法。为什么他需要一个有限的阵列?
 
Alexey Viktorov:

那么,逻辑一定是不同的。按 "+"按钮可以增加阵列的索引。达到最大值时,它不会增加,而是保持在最大值。按下按钮--指数下降。到达0,没有反应,停留在索引0。

还是有其他的想法?

PS; 又是谁贴出了用旗子工作的例子,来回应这个问题并删除了它?你为什么要删除它?毕竟,这确实是一个解决男人问题的好办法。为什么他需要一个有限的阵列?

不,这正是我的想法。我真的不知道如何正确地做,所以我按我得到的方式做了。但我注意到,当循环在程序中运行时,直到按图表上的按钮来点击循环,其他一切都不能工作。好像一切都暂停了。我不明白为什么会发生这种情况,如果有任何变体可以以不同的方式实现这个想法,我将不胜感激......

 

就这样了。问题就解决了),没有数组和其他东西。结果是更简单的))))。

第二个问题出现了。如何在代码中设置警报 触发级别,当通过鼠标的上下文菜单设置警报时,会出现设置箭头?

关于警报的问题

 

请帮助一下,有没有可能给这个EA增加一个功能,使EA在窗口EURUSD中设置的交易,在同一时间打开相同的参数,但对GBPUSD,EURUSD不会打开。

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//| 开发者。姆纳耶夫-安德烈|

//| 专家顾问:随机性。mq4|

||网站:安全-外汇。||网站:安全-外汇。|

//|邮件。minaev.work@mail.ru|

//| Skype: live:minaev.工作|

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

#property copyright "Safe-Forex.ru"

#属性链接 "https://safe-forex.ru"

#属性严格


外部 bool Use_Symbol1 = true。

外部字符串 Symbol1 = "USDJPY";


输入字符串 settings = ""; // Expert Advisor设置

输入的int magic = 111; // 输入magic

输入 double fixVolume = 0.01; // Volume

输入 int takeProfit = 500; // 利润

输入 int stopLoss = 500; //Loss

输入int buyLevel = 100; // 输入int buy Level

输入 int sellLevel = 0; // 75 卖出水平


外部int ADXperiod = 15; //ADX周期15

外部int ADXLevel =1;


外部int MAperiod =360; //MA周期80

外部int MAperiod_2 =360; //MA周期80



输入字符串 stochSettings = ""; // Stochastic Oscillator指标设置

输入 int stochPeriodK = 5; //period %K

输入 int stochPeriodD = 3; //period %D

Input int stochSlowing = 3; // Slowing down

输入ENUM_STO_PRICE stochPrice = STO_LOWHIGH; // 价格

输入ENUM_MA_METHOD stochMethod = MODE_SMA; // 方法


datetime newCandle; // 当前图表上的新蜡烛。

bool allowOpenBuy; // 允许打开买入头寸。

allowOpenSell; // 允许打开卖出头寸

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

int OnInit(void)

{

返回INIT_SUCCEED。

}

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

空白的OnDeinit(const int reason)。

{

}

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

空白的OnTick(void)。

{

if(newCandle!=Time[0]) CheckSignalExist(); newCandle=Time[0];

如果(allowOpenBuy)OpenPosition(OP_BUY)。

如果(allowOpenSell)OpenPosition(OP_SELL)。

}

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//| 函数在当前价格开仓|

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

空白的OpenPosition(int type)。

{


双倍价格=0.0。

如果(type==OP_BUY) price=Ask;

如果(type==OP_SELL) price=Bid;

int ticket=OrderSend(_Symbol,type,fixVolume,price,0,0," ,magic,0)。

// int ticket=OrderSend(,type,fixVolume,price,0,0,0," ,magic,0)。

睡眠(1000)。

如果(ticket>0)

{

如果(type==OP_BUY)

{

打印("买入仓位打开,票据:",票据)。

allowOpenBuy=false。

// SetStopOrders(ticket)。

}

如果(type==OP_SELL)

{

打印("卖出头寸已开,票据:",票据)。

allowOpenSell=false。

// SetStopOrders(ticket)。

}

}

如果(ticket<0)

{

如果(type==OP_BUY) Print("买入位置没有打开,错误:",GetLastError())。

如果(type==OP_SELL) Print("Sell position didn't open, error: " ,GetLastError());

}

}

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//|函数设置止损单|

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//void SetStopOrders(int ticket)

//{

// double stopLevel=MarketInfo(_Symbol,MODE_STOPLEVEL)。

//传播 =MarketInfo(_Symbol,MODE_SPREAD)。

// tp =takeProfit。

// sl =stopLoss。

// stopLevel+=spread。

// if(tp<stopLevel)

// {

// tp=stopLevel。

// Print("利润集的最小距离")。

// }

// if(sl<stopLevel)

// {

// sl=stopLevel。

// Print("损失集的最小距离")。

// }

// if(OrderSelect(ticket,SELECT_BY_TICKET))

// {

// int type=OrderType()。

// double opp =OrderOpenPrice();

// if(type==OP_BUY) {tp=opp+tp*_Point; sl=opp-sl*_Point;}

// if(type==OP_SELL) {tp=topp-tp*_Point; sl=opp+sl*_Point;}

// if(OrderModify(ticket,opp,sl,tp,0))

// {

// if(type==OP_BUY) Print("P&L levels set for Buy position, ticket: " ,ticket);

// if(type==OP_SELL) Print("卖出头寸的损益水平已被设定,票据:",票据)。

// }

// 否则 {

// if(type==OP_BUY) Print("买入头寸的损益水平未被设置,ticket: ",ticket," error: ",GetLastError())。

// if(type==OP_SELL) Print("卖出头寸的损益水平未被设置;ticket: ",ticket," error: ",GetLastError();

// }

// }

//}

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//| 函数检查是否有信号存在|

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

空白 检查信号是否存在(void)


{

double ADX1=iADX(Symbol(,Period(),ADXperiod,0,MODE_MAIN,1); ////////////////////////////

double ADX2=iADX(Symbol(),Period(),ADXperiod,0,MODE_MAIN,2)。

double DPLUS=iADX(Symbol(),Period(),ADXperiod,0,MODE_PLUSDI,1)。

double DMINUS=iADX(Symbol(),Period(),ADXperiod,0,MODE_MINUSDI,1)。

double MA=iMA(Symbol(),Period(),MAperiod,0,MODE_SMA,0,1)。

double MA_2=iMA(Symbol(),Period(),MAperiod_2,0,MODE_SMA,0,1)。


//PERIOD_H1

double mainLine1=iStochastic(_Symbol,PERIOD_CURRENT,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_MAIN,1) 。

mainLine2=iStochastic(_Symbol,PERIOD_CURRENT,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_MAIN,2) 。

signLine1=iStochastic(_Symbol,PERIOD_CURRENT,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_SIGNAL,1) 。

signLine2=iStochastic(_Symbol,PERIOD_CURRENT,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_SIGNAL,2) 。

评论(" ", (Ask-Bid)/1.5," ", Bid-Close[1], " ", Ask-Close[1])。

// if(mainLine1>signLine1 && mainLine2<signLine2 && mainLine1<buyLevel && ADX1>ADXLevel && mainLine2<buyLevel)

//& iClose(Symbol(),Period(),1)>MA& iClose(Symbol(),Period(),1)>MA_2 && signLine1<buyLevel && signLine2<buyLevel

if(mainLine1>signLine1 && mainLine2<signLine2 && mainLine1<buyLevel && ADX1>ADXLevel && mainLine2<buyLevel)

//&Close[2]<MA& Close[2]<MA_2 && signLine1<buyLevel && signLine2<buyLevel

&&Close[10] > Close[1]-(Close[1]-Close[20] )

&& Close[10]>Bid )

{

Print("出现了一个开立买入头寸的信号")。

如果(GetPositionsNumber()==0)

{

// allowOpenSell=true。

{ allowOpenBuy=true;

睡眠(1000)。

Print("允许开立买入头寸")。

}

}

// if(mainLine1<signLine1 && mainLine2>signLine2 && mainLine1>sellLevel && ADX1>ADXLevel && mainLine2>sellLevel

//& iClose(Symbol(),Period(),1)<MA& iClose(Symbol(),Period(),1)<MA_2 && signLine1>sellLevel && signLine2>sellLevel

if(mainLine1>signLine1 && mainLine2<signLine2 && mainLine1<buyLevel && ADX1>ADXLevel && mainLine2<buyLevel)

//&Close[2]>MA& Close[2]>MA_2 && signLine1<buyLevel && signLine2<buyLevel

&&Close[10] < Close[1]+(Close[20]-Close[1])

&& Close[10]<Ask )

{

Print("出现了一个卖出头寸的信号")。

如果(GetPositionsNumber()==0)

{

// allowOpenBuy=true。

allowOpenSell=true。

睡眠(1000)。

Print("允许打开卖出头寸")。

}

}

}
















/////////////////////////////////////////



//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//| 该函数返回未平仓头寸的数量。|

//+-------------------------------------------------------------------------------------------------------------------------------------------------+







int GetPositionsNumber(void)

{

int number=0。

for(int i=0; i<OrdersTotal(); i++)

如果(OrderSelect(i,SELECT_BY_POS))

如果(OrderSymbol()==_Symbol && OrderMagicNumber()==magic)

号码++。

返回编号。

}

//+---------------------------------------------------------------------------------------------------------------------------------

 
vvs1:

帮助一下,有没有可能给这个EA增加一个功能,使安装在欧元兑美元窗口的EA在同一时间以相同的开仓参数开仓,但在英镑兑美元上开仓,而不在欧元兑美元上开仓。

对不起,你的头还好吗?你不仅在一个地方插入了代码,而且还留下了大量的空行。

你不觉得你应该对你请求帮助的人有一些尊重吗?

原因: