//сначала надо объявить импорт функции из DLL#import "имя_вашей_длл.dll"int SortStringArray(string *arr[],constint arraysize);
#import
//в тексте программы вызов проще простогоstring arr[];
int size;
...
//где-то в коде массив заполняется
...
//а вот и вызов сортировки
SortStringArray(arr,size);
while(true) // Цикл закрытия орд.
{
if (Total==0 && Opn_B==true) // Открытых орд. нет +
{ // критерий откр. Buy
RefreshRates(); // Обновление данных
SL=Bid - New_Stop(StopLoss)*Point; // Вычисление SL откр.
TP=Bid + New_Stop(TakeProfit)*Point; // Вычисление TP откр.Alert("Попытка открыть Buy. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP);//Открытие Buyif (Ticket > 0) // Получилось :)
{
Alert ("Открыт ордер Buy ",Ticket);
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибокcontinue; // Повторная попыткаreturn; // Выход из start()
}
和错误处理功能。
int Fun_Error(int Error) // Ф-ия обработ ошибок
{
switch(Error)
{ // Преодолимые ошибки case4: Alert("Торговый сервер занят. Пробуем ещё раз..");
Sleep(3000); // Простое решениеreturn(1); // Выход из функцииcase135:Alert("Цена изменилась. Пробуем ещё раз..");
RefreshRates(); // Обновим данныеreturn(1); // Выход из функцииcase136:Alert("Нет цен. Ждём новый тик..");
while(RefreshRates()==false) // До нового тикаSleep(1); // Задержка в циклеreturn(1); // Выход из функцииcase137:Alert("Брокер занят. Пробуем ещё раз..");
Sleep(3000); // Простое решениеreturn(1); // Выход из функцииcase146:Alert("Подсистема торговли занята. Пробуем ещё..");
Sleep(500); // Простое решениеreturn(1); // Выход из функции// Критические ошибкиcase2: Alert("Общая ошибка.");
return(0); // Выход из функцииcase5: Alert("Старая версия терминала.");
Work=false; // Больше не работатьreturn(0); // Выход из функцииcase64: Alert("Счет заблокирован.");
Work=false; // Больше не работатьreturn(0); // Выход из функцииcase133:Alert("Торговля запрещена.");
return(0); // Выход из функцииcase134:Alert("Недостаточно денег для совершения операции.");
return(0); // Выход из функцииdefault: Alert("Возникла ошибка ",Error); // Другие варианты return(0); // Выход из функции
}
}
我想问的是。我想问:我可以从129个错误中再加一行吗?
case129:Alert("Неправильные цены. Пробуем ещё раз..");
RefreshRates(); // Обновим данныеreturn(1);
这是项目的.cpp文件,看看吧,经过谷歌和Yandex的几次搜索,我没有发现任何脑洞大开的东西,大致上可以理解。它甚至看起来很简单。
但它是如何工作的呢?我不太确定如何引用这个ddl--从EA的代码中引用?如何?首先,它看起来像这样 #include <GetIntValue>.
2.调用dll时,你不必一直开着工作室,对吗? 它是如何执行的?
请展示一下从mql代码中调用这个dll的最简单的例子。
我不明白这里的情况...
如果开出第二个单向订单,手数应以指数形式增加(乘数为2)。
这就是结果。
然后像这样
你会得到这样的结果
然后就这样了。
谢谢,我明白了......我已经想好了。
这条线是做什么用的?
datetime o;
还有一个问题,我有一个尾随订单。当1个单向订单打开时,一切都很正常,如果更多,就会因某种原因而不工作。为什么?
{
for(int i = 0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
{
if(Bid - OrderOpenPrice() > TrailingStop*Point)
{
if (OrderStopLoss() < Bid - (TrailingStop + TrailingStep)*Point)
{
SL = NormalizeDouble(Bid - TrailingStop*Point,Digits);
if (OrderStopLoss() !=SL)
OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0);
}
}
}
if (OrderType() == OP_SELL)
{
if(OrderOpenPrice() - Ask > TrailingStop*Point)
{
if (OrderStopLoss() > Ask + (TrailingStop+ TrailingStep)*Point)
{
SL = NormalizeDouble (Ask+TrailingStop*Point,Digits);
if (OrderStopLoss() !=SL)
OrderModify (OrderTicket(), OrderOpenPrice(), SL,0,0);
}
}
}
}
}
}
}
这是项目的.cpp文件,看看吧,经过谷歌和Yandex的几次搜索,我没有发现任何脑洞大开的东西,大致上可以理解。这甚至看起来很简单。
但它是如何工作的呢?我不太确定如何引用这个ddl--从EA的代码中引用?如何?首先,它看起来像这样 #include <GetIntValue>.
大致是这样的。为了让它工作,你需要编译dll并把它放在experts/libraries文件夹中(阅读帮助和教程,那里有详细说明)。
2.调用dll时,你不必一直开着工作室,对吗? 那么它是如何执行的?
还有一个问题,我有一个尾随订单。当1个单向订单打开时,一切都很正常,如果更多,就会因某种原因而不工作。为什么?
{
for(int i = 0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
{
if(Bid - OrderOpenPrice() > TrailingStop*Point)
{
if (OrderStopLoss() < Bid - (TrailingStop + TrailingStep)*Point)
{
SL = NormalizeDouble(Bid - TrailingStop*Point,Digits);
if (OrderStopLoss() !=SL)
OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0);
}
}
}
if (OrderType() == OP_SELL)
{
if(OrderOpenPrice() - Ask > TrailingStop*Point)
{
if (OrderStopLoss() > Ask + (TrailingStop+ TrailingStep)*Point)
{
SL = NormalizeDouble (Ask+TrailingStop*Point,Digits);
if (OrderStopLoss() !=SL)
OrderModify (OrderTicket(), OrderOpenPrice(), SL,0,0);
}
}
}
}
}
}
}
因为你需要向函数传递参数,请尝试这样做
bool IfProfTrail=false; // 只对盈利的头寸使用--盈亏平衡模式
int TrailingStop=0; // 拖曳距离=0 - 允许的最小距离
int TrailingStep=1; // 拖曳距离步骤
非常感谢您!
现在我明白问题出在哪里了。
对于购买,我使用了。
据我所知,买入是要价,但iClose(Symbol(),Period(),0)从要价中获取价格。这可能是出错的原因。
但这里的问题出现了,因为该EA不是基于点数的EA,价格在买入区的时间很长,而且每一个刻度都在更新。现在我使用以下组合。
为什么交易不开放?事实证明,EA在错误上停止,没有看到进一步的价格运动?
我的专家顾问的模板来自https://c.mql5.com/mql4/book/mq4/experts/tradingexpert.mq4
在您看来,我是否应该在该EA的错误处理功能中加入对129和138错误的检查?
如果是,如何做呢?
至少,你必须有自己的开仓/设单功能,以处理所有的错误。这是你需要获得最新价格的地方。
我还没有看过任何空白的东西。但我想说:EA需要处理服务器返回的所有错误。而这还远远不够。它应该能够在任何意外情况发生后,在不丧失功能和不发生算法故障的情况下恢复其位置,并继续其工作,就像没有发生过任何特殊情况一样。
至少你应该有自己的开仓/定单函数来处理所有错误。这是你需要获得最新价格的地方。
我还没有看过任何蓝图。但我要说:你需要在你的EA中处理所有由服务器返回的错误。而这是不够的。它必须能够在任何不可预见的情况下,在不失去功能的情况下,在其算法没有任何故障的情况下,重新拾起它的位置,并继续其工作,就像没有发生过任何特殊情况一样。
该模板取自一本教科书。我不太擅长错误处理 功能。
在订单打开时,有RefreshRates();(我已经按照建议通过市场信息替换了Bids和Asks)。
和错误处理功能。
我想问的是。我想问:我可以从129个错误中再加一行吗?