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

 
sss2019:

告诉我如何在这个条件下写一个EA。

有三种货币对,EA将在这些货币对上进行交易,EA只依附于一个图表,在另外两个图表上它自己工作,一般来说是多货币。

第二个条件是当任何货币对的价格达到一定水平时,交易就会开启。每次只能打开一个交易。

一旦交易结束,如果价格接近,专家顾问可以在任何一个交易对重新打开交易。

我设置了一个静态变量,只要该变量的值为false,交易就被允许打开,一旦任何一对订单被打开,该变量的值为true。一旦订单被关闭,for循环找不到任何交易,该变量就会再次取值为false。

例如,如果每个货币对只应开立一个交易,这意味着每个货币对都有自己的变量。

对这个问题是否有更合理的解决办法?


订单中有一个参数,如 "Magik"--只需计算具有某种Magik的订单,并允许或禁止交易。
 

如何正确地关闭订单,如何收集订单的信息?

我对事先提出的愚蠢问题表示歉意)我写了以下算法:我想在开盘低于分形上升且收盘高于分形上升时建立 买入头寸,在开盘高于分形下降且收盘低于分形下降时建立卖出头寸;我还想在空头85点或在38根蜡烛(const. S)内建立订单时,关闭所有头寸。我感觉根本没有什么被关闭,只有被关闭的订单,总的来说,我感觉我处理订单的方式不对,我的操作不正确,然后我以错误的方式关闭它们))请告诉我如何正确地关闭它们,使它们不会滑落关闭,这个代码中哪里有错误。或者可以作为一个例子,说明nyu如何行走,在其中所有这些操作都做得很充分。提前感谢您的帮助!)


Extern int S=38; //烛台数,之后将平仓
extern int SL=85; //止损,在任何情况下都将平仓
extern int HIGH=0; //在哪个时间段搜索极值(5或1或0(D1))
extern int l=1; //交易的手数
int massorder[30][30]; //有开放手数的数据
int numb=1; //阵列中el-ta的数量,这是otc。开手
int i=0;
int ticket=0;
int x=0;
double down,up=0;
double highH1,lowH1=0。

int start()

{
if(Hour()>x)
{
searchH1();
up=highH1;
down=lowH1;
i++;
}
//
if(Open[1]<up && Close[1]>up)//如果蜡烛在开盘时低于分形水平,收盘时也低于分形水平了,那么
{
ticket=OrderSend(Symbol(),OP_BUY,l,Bid,5,Bid-SL*Point,NULL);
i=0;
savedata();
}
if(Open[1]>down && Close[1]<down)//如果蜡烛的开盘价高于收盘价,收盘价低于下跌分形水平,那么
{
ticket=OrderSend(Symbol(),OP_SELL,l,Ask,5,Ask+SL*Point,NULL);
i=0;
savedata();
}
if(i==S)
{
closeAllticket();
closeAllPos();
}
i++;
//----
x=Hour();
if(Hour()==23)
x=-1;
return(0);
}
//+------------------------------------------------------------------+
void closeAllticket()
{
for(int j=0;j<=numb;j++)
{
OrderClose(massorder[j][0],l,Ask,5);
OrderClose(massorder[j][0],l,Bid,5);
}
numb=0;
}
void closeAllPos()
{

for(int j=0;j<=OrdersTotal();j++)
{
OrderSelect(j,SELECT_BY_POS);
OrderClose(OrderTicket(),l,Ask,5);
OrderClose(OrderTicket(),l,Bid,5);
}
}
void searchH1()//寻找分形的函数
{
if(iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,2) &&iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,1) &&&iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,4) &&iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,5) )
highH1=iHigh(Symbol(),PERIOD_H1,3)

if(iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,2) && iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,1) && iHigh(Symbol(),PERIOD_H1,3) <iHigh(Symbol(),PERIOD_H1,4) &&iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,5))
lowH1=iHigh(Symbol(),PERIOD_H1,3);
return (0);

}

void savedata() //将数据保存到数组的程序
{

OrderSelect(ticket,SELECT_BY_TICKET);
massorder[numb][0]=OrderTicket();
massorder[numb][1]=OrderOpenPrice() 。
massorder[numb][2]=OrderStopLoss();
massorder[numb][3]=OrderTakeProfit();
if(OrderType() ==OP_BUY)
massorder[numb][4]=0;
if(OrderType() ==OP_SELL)
massorder[numb][4]=1;
numb++;

}
 
Qwertee:

如何正确地关闭订单,如何收集订单的信息?

我对事先提出的愚蠢问题表示歉意)我写了以下算法:我想在开盘低于分形上升且收盘高于分形上升时建立买入头寸,在开盘高于分形下降且收盘低于分形下降时建立卖出头寸;我还想在空头85点或在38根蜡烛(const. S)内建立订单时,关闭所有头寸。我感觉根本没有什么被关闭,只有被关闭的订单,总的来说,我感觉我处理订单的方式不对,我的操作不正确,然后我以错误的方式关闭它们))请告诉我如何正确地关闭它们,使它们不会滑落关闭,这个代码中哪里有错误。或者可以作为一个例子,说明nyu如何行走,在其中所有这些操作都做得很充分。提前感谢您的帮助!)


全局变量 中,如果你在开始时已经指定了停止点

extern int MagicNumber = 11113;
int cntBuy = 0, cntSell = 0, totalBuy, totalSell;

在你打开订单之前。

           totalBuy = CountTradesBuy();
           totalSell = CountTradesSell();

在信号中打开

if((Open[1]<up) && (Close[1]>up) && (totalBuy < 1) && (totalSell < 1))

if((Open[1]>down) && (Close[1]<down) && (totalBuy < 1) && (totalSell < 1))

在EA结束时

int CountTradesBuy() {
   int countBuy = 0;
   for (int tradeBuy = OrdersTotal() - 1; tradeBuy >= 0; tradeBuy--) {
      OrderSelect(tradeBuy, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         if (OrderType() == OP_BUY) countBuy++;
   }
   return (countBuy);
}

int CountTradesSell() {
   int countSell = 0;
   for (int tradeSell = OrdersTotal() - 1; tradeSell >= 0; tradeSell--) {
      OrderSelect(tradeSell, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         if (OrderType() == OP_SELL) countSell++;
   }
   return (countSell);
}

我想我没有忘记什么

 
belck:


在全局变量中,你已经在开始时指定了停止的位置

在订单开启之前。

在信号中打开

在EA结束时

就像什么都没有被遗忘



我把你写的东西都放进去了,但是不知道为什么还是没有变化。结果还是和以前一样,现在也是一样,订单保持大量的时间,我需要它们在S条后关闭,这是怎么回事?????????????????。

附加的文件:
ikdgna.mq4  7 kb
 
Qwertee:


我把你写的东西都放进去了,但还是没有任何变化。结果是原来是这样,现在也是这样,订单仍然开放了很多时间,我需要它们在S条后关闭,这是怎么回事?????????????????。

叫停订单应该在开盘前进行。 我在关闭时有这些。

在最具全球性的

#include <stdlib.mqh>


我在开单前是这样说的。

if ()
   {
    CloseAllBuy();
    }
    
       
   if () 
   {
   CloseAllSell();
   }

или

if ()
   {
    CloseAllBuy();
    CloseAllSell();
     }

而这是在EA的最末端

void CloseAllBuy()
{
        int i;
        int Orders = OrdersTotal();
        bool result;
        datetime begin;
        
        if(Orders > 0)
        {
                for(i = Orders-1; i >= 0; i--)
                {
                        if( OrderSelect(i, SELECT_BY_POS, MODE_TRADES) )
                        {
                                if(OrderSymbol() == Symbol() && OrderType() == OP_BUY && OrderMagicNumber() == MagicNumber)
                                {
                                        RefreshRates();
                                        begin = TimeCurrent();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), slip, Yellow); // закрываем все встречные ордера
                                        while(!result && TimeCurrent() - begin <= 60 && !IsTesting())
                                        {
                                                Sleep(100);
                                                RefreshRates();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), slip, Yellow);//закрываем все встречные ордера
                                        }
                                        if(!result)
                                        {
                                                int error = GetLastError();
                                                Print("Ошибка закрытия ордера BUY #" + OrderTicket() + " " + ErrorDescription(error));
                                        }
                                }
                        }
                        else
                        {
                                Print("Не удалось выбрать открытый ордер:" + ErrorDescription(error));
                        }
                }
        }
}

void CloseAllSell()
{
        int i;
        int orders = OrdersTotal();
        bool result;
        datetime begin;
        
        if(orders > 0)
        {
                for(i = orders-1; i >= 0; i--)
                {
                        if( OrderSelect(i, SELECT_BY_POS, MODE_TRADES) )
                        {
                                if(OrderSymbol() == Symbol() && OrderType() == OP_SELL && OrderMagicNumber() == MagicNumber)
                                {
                                        RefreshRates();
                                        begin = TimeCurrent();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), slip, Yellow); // закрываем все встречные ордера
                                        while(!result && TimeCurrent() - begin <= 120 && !IsTesting())
                                        {
                                                Sleep(100);
                                                RefreshRates();
                   result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), slip, Yellow);//закрываем все встречные ордера
                                        }
                                        if(!result)
                                        {
                                                int error = GetLastError();
                                                Print("Ошибка закрытия ордера SELL #" + OrderTicket() + " " + ErrorDescription(error));
                                        }
                                }
                        }
                        else
                        {
                                Print("Не удалось выбрать открытый ордер:" + ErrorDescription(error));
                        }
                }
        }
}

 

向专家提问,对于EA有什么标准吗,比如测试的某个时间段内的最低手数?损失的百分比,等等?

我只有2个EA,它们每年做100次交易,另一个总共做30次交易......(时间范围分别为15、30)。盈利能力很好,第一个是在真实报价上的演示,现在正在测试......但谁能告诉我是否有一个更好的......但也许有人会告诉我是否有比MT4更好的测试?

 
你能告诉我如何执行一个条件吗?我们有一个条件,只要价格达到1.2550,就在目前的价格上开一个买单。因此,当价格高于或等于1.2550时,订单被打开,当订单被打开时,静态变量 会阻止新订单的打开,直到订单达到0。因此,一旦订单被关闭,没有更多具有这种魔力的订单时,打开的禁令被取消,新订单被打开,但价格早已远离这个水平。我们需要专家顾问在价格达到这个水平时打开市场订单,而不是待定订单。
 

各位行家好))))

有一个指标在最后两个分形上画趋势线,但它是在 "未确认的分形 "之后画的,也就是说,分形之后的第二个条形还没有形成,但线已经画好了。如何使它在第二根柱子之后画出来,而不是在第一根柱子之后?指标在标签中。

附加的文件:
 
rigc:

各位行家好))))

有一个指标在最后两个分形上画趋势线,但它是在 "未确认的分形 "之后画的,也就是说,分形之后的第二个条形还没有形成,但线已经画好了。如何使它在第二根柱子之后画出来,而不是在第一根柱子之后?指标在标签中。


尝试
附加的文件:
 
Figar0:

尝试
根本不画)))