[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要路过。没有你就无处可去 - 3. - 页 182

 
如何订购顾问
 
dent:
如何订购顾问
你可以在这里订购:https://www.mql5.com/ru/job
 
NaVolne:


为什么会出现这种情况呢?

EA处理每一个tick,在每一个tick上都有一个检查和打开一个订单....。你需要记住最后一次开仓 的时间,并暂停15分钟,或者你可以按一个柱子的开盘或收盘工作。最好是在代码中与酒吧时间相联系。

double OpenBar=0; 
 
int start()
   {
    //Проверка на начало нового бара
    if (OpenBar==Time[0]) {return;} else {OpenBar=Time[0];}
    //ваш код
   }
 
dent:
如何订购顾问
 
OlegTs:
double OpenBar=0; 

 

int start()
   {
    //Проверка на начало нового бара
    double CurOpenBar=iOpen(NULL,PERIOD_M15,0);  
    if (OpenBar==CurOpenBar) {return;} else {OpenBar=CurOpenBar;}
    //ваш код
   }


诸如此类的东西...

一个坏的例子。因为蜡烛图的开盘价 可以重复。但时间上却没有。
 
MaxZ:
坏的例子。因为蜡烛图的开盘价可以重复。但时间上却没有。

我同意:)))
 
非常感谢你们,它已经开始发挥作用了 :)
 

我正在努力学习mcl4,并编写一个 测试用的EA。出现了一些问题。

1)是否有一个程序可以检查这个或那个货币对的分析历史是否有缺失的分钟蜡烛?也许这个程序已经写好了,在网上可以找到?

2) 如果有缺口或只有少量的历史,EA如何从必要的日期下载这个或那个货币对的整分钟蜡烛图或填补缺口?

我们的想法是,EA将在工作时检查历史的正确性,并在必要时纠正缺口或小数量的条形。
 

我正在学习一种编程语言,我在理解程序的行为方面遇到了困难。我根据教科书写了一个EA,但我把它扭曲成一个稍微不同的操作原理。

专家顾问是基于2μW的平均数。这个想法很简单,移动平均线交叉,订单被关闭,相反的订单被打开。我已经写了一个EA,它工作得很好。当然,它处于轻微的劣势,但符合想法。整个问题如下(黑体字)。

A=iMA(NULL,0,Period_MA_1,0,MODE_SMA, PRICE_CLOSE,1); // A

B=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,1); // B

C=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,2); // C

D=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,2); // D

如果我改变移动平均线的计算方式(可以显示加号),用指数法 MODE_SMA) 代替简单法(MODE_EEMA ),再加上一个(MODE_SMMA),即所谓的平滑法,一切都会出问题。 工作原理变得更加有趣(在策略测试器中),因为EA在设定的时间段的最开始打开一个订单,并在结束时关闭它。也就是说,对于一年来说,它在期初开出一个单一的交易,并在期末关闭。结果,专家顾问向我展示了一个加号,但我不需要这样的加号。我可以自己掷硬币,打开买入或卖出订单,看看,我在一年内是赢还是输。顺便说一下,如果我把MODE_SMA 设置为MODE_LWMA 线性加权移动平均),程序就能正常工作

请告诉我,什么是错的?原理是一样的;只是移动平均线的计算方式有了一些改变。

以下是该程序的全部代码。

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

//|基于两条移动平均线.mq4

//| Copyright © 2011, MetaQuotes Software Corp.

//| http://www.metaquotes.net |

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

#property copyright"Copyright © 2011, MetaQuotes Software Corp.

#属性链接 "http://www.metaquotes.net"



//--------------------------------------------------------------- 1 --

// M15的数值


Extern int int Period_MA_1=6; // Period MA1

Extern int Period_MA_2=15; // Period MA 2

外部双数 Lots =0.1; // 固定的手数



bool Work=true; // 专家顾问将工作。

string Symb; // 金融工具的名称

//--------------------------------------------------------------- 2 --

int start()

{

䵮䵮

总数, // 窗口中的订单数

Tip=-1, // 选择的订单类型(B=0,S=1)。

Ticket; // 订单号

A, //值。从末尾开始的第一个小节的MA_1值

从末尾开始的第一根柱子的MA_2值

价格, // 所选订单的价格

C, //值。从末尾开始的第二小节的MA_1

D, // 重要性。从末端开始的第二个柱状的MA_2值

Lot; // 所选订单中的手数

bool

Ans =false, // 关闭后的服务器响应

Cls_B=false, // 关闭购买的标准

Cls_S=false, //关闭Sell的标准。

Opn_B=false, //开买的标准

Opn__S=false; // 开启Sell的标准。

//--------------------------------------------------------------- 3 --

//预处理

如果(Bars < Period_MA_2) // 没有足够的条数

{

Alert("窗口中没有足够的条形,专家顾问不工作。")。

return; // 退出start()

}

if(Work==false) // 严重错误。

{

Alert("Critical error. Expert Advisor is not working.")。

return; // 从start()退出。

}

//--------------------------------------------------------------- 4 --

// 顺序计数

Symb=Symbol(); // 金融工具的名称。

总数=0; // 订单数量

for(int i=1; i<=OrdersTotal(); i++) // 订单循环

{

如果(OrderSelect(i-1,SELECT_BY_POS)==true) //如果

{ // 订单分析。

如果(OrderSymbol()!=Symb)继续; // 不是我们的金融工具

如果(OrderType()>1) // 我们有一个待定订单

{

Alert("检测到挂单,专家顾问不工作;)

return; // Exit()

}

总计++; // 市场订单计数器

if (Total>1) // 不超过一个订单

{

警报("几个市场订单,专家顾问不工作;)

return; // Exit()

}

Ticket=OrderTicket(); // 选择的订单号。

Tip =OrderType(); // 所选订单的类型。

Price =OrderOpenPrice(); // 所选订单的价格。

Lot =OrderLots(); // Lot的数量

}

}

//--------------------------------------------------------------- 5 --

// 贸易标准

A=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,1); // A

B=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,1); // B

C=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,2); // C

D=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,2); // D


if (A<C&C>D&B>=A) // МА1线往下走。

{ // MA1与MA2交叉

Opn_B=true; //从上面往下看

Cls_S=true; //

}

如果(B<D&D>C&A>=B) // MA2线往下走

{ // MA2与MA1交叉

Opn_S=true; //自上而下

Cls_B=true; //

}

//--------------------------------------------------------------- 6 --

// 关闭订单

while(true) //Order closing loop.

{

if (Tip==0 && Cls_B==true) //打开买入订单。

{ //有一个封闭的标准

Alert("Trying to close Buy" ,Ticket," ;)

RefreshRates(); // 刷新数据

Ans=OrderClose(Ticket,Lot,Bid,2); // Closed Buy

如果(Ans==true) //成功了 :)

{

警报("关闭买入订单",Ticket;)

break; // 从闭环中退出

}

如果(Fun_Error(GetLastError())==1) //错误处理

continue; // retry

return; // 从start()退出。

}


if (Tip==1 && Cls_S==true) // 卖出订单打开。

{ // 有一个接近的标准

Alert("Attempting to close Sell",Ticket," ;)

RefreshRates(); // 刷新数据

Ans=OrderClose(Ticket,Lot,Ask,2); // Close Sell

如果(Ans==true) // 成功了 :)

{

提醒("卖出订单关闭",Ticket;)

break; // 从闭环中退出

}

如果(Fun_Error(GetLastError())==1) //错误处理

continue; // retry

return; // 从start()退出。

}

break; // Exit while

}

//--------------------------------------------------------------- 7 --

//--------------------------------------------------------------- 8 --

//开启订单

while(true) //Order closing loop.

{

if (Total==0 && Opn_B==true) // 没有未结订单

{ //开放购买标准。

RefreshRates(); // 更新数据

Alert("Trying to open Buy. Waiting for reply...")。

Ticket=OrderSend(Symb,OP_BUY,Lots,Ask,20,0,0, "EA 2xMA");//开放购买

if (Ticket > 0) // 它成功了 :)

{

警报("买入订单打开",Ticket;)

return; //退出订单

}

如果(Fun_Error(GetLastError())==1) //错误处理

continue; // retry

return; // 从start()退出。

}

if (Total==0 && Opn_S==true) // 没有未结订单

{ //开放销售标准。

RefreshRates(); // 更新数据

Alert("Attempting to open Sell. Waiting for reply...")。

Ticket=OrderSend(Symb,OP_SELL,Lots,Bid,20,0,0, "EA 2xMA");//Open Sel.

if (Ticket > 0) // 它成功了 :)

{

警报("卖出订单打开",Ticket;)

return; // 从start()中退出

}

如果(Fun_Error(GetLastError())==1) //错误处理

continue; // retry

return; // 从start()退出。

}

break; // Exit while

}

//--------------------------------------------------------------- 9 --

return; //从start()中退出。

}

//-------------------------------------------------------------- 10 --

int Fun_Error(int Error) // 错误处理 fie

{

switch(Error)

{ // 无法克服的错误。

case 4: Alert("The trade server is busy. Try again...");

Sleep(3000); // 简单的解决方案。

return(1); // 退出函数。

case 135:Alert("Price changed. Try again...")。

RefreshRates(); // 刷新数据。

return(1); // 从函数中退出。

case 136:Alert("No price. Waiting for a new tick...")。

while(RefreshRates()==false) // 读取一个新的刻度线

Sleep(1); // 循环中的延迟。

return(1); // 从函数中退出。

case 137:Alert("Broker is busy. Try again...");

Sleep(3000); // 简单的解决方案。

return(1); // 从函数中退出。

case 146:Alert("The trading subsystem is busy. Try again...");

Sleep(500); // 简单决定

return(1); // 从函数中退出。

// 严重错误

case 2: Alert("General error;)

return(0); // 从函数中退出。

case 5: Alert("旧版本的终端。")。

Work=false; // 不再工作

return(0); // 从函数中退出。

case 64: Alert("Account blocked.");

Work=false; // 不再工作

return(0); // 从函数中退出。

case 133:Alert("禁止交易。")。

return(0); // 从函数中退出。

case 134:Alert("没有足够的钱来执行交易")。

return(0); // 从函数中退出。

默认:Alert("An error has occurred",Error); // Other options

return(0); // 从函数中退出。

}

}

//-------------------------------------------------------------- 11 --



 
neisseria:

我正在学习一种编程语言,我在理解程序的行为方面遇到了困难。我在教程的基础上写了一个EA,但我把它改成了一个稍微不同的原则。



当关闭订单时,最好能减少总数,或者,最好不要把程序想得太复杂,做一个函数,返回符号和魔法数字的未结订单数量。

四条移动平均线 太多,最好是在两个时期和不同的偏移量中显示它们。建议在屏幕上显示它们,看看它们的表现如何。