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

 
datetime some_time=TimeCurrent();
//extern string Symbol3 = ""; //Инструмент (""текущий по умолчанию)
extern int P=1;          //Таймфрейм
extern int MagicNumber = 100500;  // Установили магик


int start()
{

int send;
                                     
double SL=200;                                   
double TP=200;                       
double Lots=1;       

for(int i = OrdersTotal(); i >=0; i--)                                            // цикл для проверки ордеров
{
int af=OrderSelect(i, SELECT_BY_POS,MODE_TRADES);                                // Шаг 1: OrderSelect Выбираем ордер (SELECT_BY_POS - по порядковому номеру), (MODE_TRADES -из отложенных и открытых)

if((OrderSymbol() == "EURUSD") && (OrderMagicNumber() == MagicNumber))return(0); // Шаг 2: Если символ EURUSD отсутствует,И если ордер присутствует , и ни один из ордеров НЕ содержит магикномер, то выходим из цикла.( выходим -значит откр. позицию) 
                                                                                    (если какое-либо условие из двух указанных не совпадает, то выходим) 
}
          

             
if ((Close[0]>High[1]))
{
send=OrderSend("EURUSD",OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,MagicNumber);
}

if ((Close[0]<Low[1]))  
{
send=OrderSend("EURUSD",OP_SELL,Lots,Bid,3,Ask+SL*Point,Ask-TP*Point,MagicNumber);
}

return(0);
}

我的理解是,这就像定期检查可用性。(是否有EURUSD?以及是否有指定的Magic订单?)如果缺少任何一个条件,我们开仓。只有当这两个条件都满足时,我们才开仓。

然后,我们在步骤2中被问到。假设我们有一个手动打开的订单。那么我们就满足了第一个条件(我们有相同的符号),我们将不满足第二个条件,因为这个命令不包含魔法。如果其中一个条件不匹配,那么代码应该打开订单。这正是代码的作用。但在下一次打勾时,它打开了第三、第四和第五个订单.....。

为什么会开出第三个订单?

但有两个订单总共满足这两个条件。应该有一个检查(改成return(0)),而不是一个开口。,而不是开口。

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
大家晚安!你能告诉我是否能在mql5中写一段代码,在图表上画一条线(图片附后)并在文件中记录这条线的所有坐标?如果你想把这条线作为未来的基础,那么你需要把它作为交易机器人的基础。 直接的
 
GlushkoV_V_V:
大家晚安!你能告诉我是否能在mql5中写一段代码,在图表上画一条线(图片附后)并在文件中记录这条线的所有坐标?如果你想画一条线并将其填入坐标,那么你需要对该线进行简单的追踪。

一切都在文件 中。

Документация по MQL5: Графические объекты / ObjectCreate
Документация по MQL5: Графические объекты / ObjectCreate
  • www.mql5.com
[in]  Номер подокна графика. 0 означает главное окно графика. Указанное подокно должно существовать, в противном случае функция возвращает false. Возвращает true при успешной постановке команды в очередь указанного графика, иначе false. Если объект был уже создан ранее, то производится попытка изменить его координаты. При вызове ObjectCreate...
 
Сергей Таболин:

一切都在文件 中。

谢谢你的提示,也许你可以帮我造一个,当然是免费的。

 
GlushkoV_V_V:

谢谢你的提示,但也许你可以帮我造一个这样的东西,当然不是免费的。

不是免费的--这是 你的)))。

Торговые приложения для MetaTrader 5 на заказ
Торговые приложения для MetaTrader 5 на заказ
  • www.mql5.com
Убрать из советника второй индикатор заменить другим,изменить условие открытие ордера .Условие сделки покупка: НМА линия вверх второй индикатор столбик гистограмы выше нуля (второй индикатор пересечение нуля точка входа) по закрытой свече если нма и второй индикатор не изменили показания совершается покупка для продаже наоборот.Изменить...
 
非常感谢,但对我来说,这就像中文,我不知道如何在代码中实现它。
 
Alexey Belyakov:

我的理解是,这就像定期检查可用性。(是否有EURUSD?以及是否有指定的Magic订单?)如果缺少任何一个条件,我们开仓。只有当这两个条件都满足时,我们才开仓。

然后,我们在步骤2中被问到。假设我们有一个手动打开的订单。那么我们就满足了第一个条件(我们有相同的符号),我们将不满足第二个条件,因为这个命令不包含魔法。如果其中一个条件不匹配,那么代码应该打开订单。这正是代码的作用。但在下一次打勾时,它打开了第三、第四和第五个订单.....。

为什么会开出第三个订单?

但有两个订单总共满足这两个条件。应该有一个检查(改成return(0)),而不是一个开口。但不包括开幕式。

== - 如果相等 != - 如果不相等。继续 - 循环迭代结束,开始一个新的循环迭代。断裂--循环终止,并过渡到循环后的下一个操作者,返回--函数终止,在你的例子中是Onstart,并等待新的tick。如果你的魔力的订单是开放的,它应该结束功能并离开以等待新的勾选。

问题,如果你想在当前窗口打开订单,为什么要明确指定工具,还是想从其他工具的窗口打开订单?也不清楚你想开多少个订单。根据你的代码,只能打开一个订单,只有在它关闭后,才会打开第二个订单。你有一个魔术师和一个开窗工具。另外,订单的开仓条件是针对当前工具而不是针对欧罗巴的。

datetime some_time=TimeCurrent();
//extern string Symbol3 = ""; //Инструмент (""текущий по умолчанию)
extern int P=1;          //Таймфрейм
extern int MagicNumber = 100500;  // Установили магик


int start()
{

int send;
                                     
double SL=200;                                   
double TP=200;                       
double Lots=1;       

for(int i = OrdersTotal(); i >=0; i--)                                            // цикл для проверки ордеров
{
bool af=OrderSelect(i, SELECT_BY_POS,MODE_TRADES);     // OrderSelect возвращает тип bool                           
                                               // Шаг 1: OrderSelect Выбираем ордер 
                                   //(SELECT_BY_POS - по порядковому номеру), (MODE_TRADES -из отложенных и открытых)

if((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber))return(0); // Шаг 2: Если символ Выбранного ордера 
                                        //равен EURUSD (заменено на текущий инструмент открытого окна) ,
                                       // И если магик Выбранного ордера равен магик то выходим из функции Онстарт.
// Если же наш ордер не будет выбран из ордеров терминала, то цикл закончится и начнется выставление ордеров. 
                                                                                   
}
          

             
if ((Close[0]>High[1])) // клоз и хай здесь для текущего окна и инструмента. 
{
send=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,MagicNumber); // так же здесь цены аск и бид тоже для текущего инструмента
}

if ((Close[0]<Low[1]))  
{
send=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+SL*Point,Ask-TP*Point,MagicNumber); // и поинт кстати тоже.
}

return(0);
}
 
Valeriy Yastremskiy:

== - 如果相等!= - 如果不相等。Kontinue - 终止循环迭代并开始一个新的循环迭代。Break - 终止循环并进入循环后的下一个运算符,return - 终止函数,在你的例子中是Onstart,并等待一个新的tick。如果你的魔力的订单是开放的,它应该结束功能并离开以等待新的勾选。

问题,如果你想在当前窗口打开订单,为什么要明确指定工具,还是想从其他工具的窗口打开订单?也不清楚你想开多少个订单。根据你的代码,只能打开一个订单,只有在它关闭后,才会打开第二个订单。你有一个魔术师和一个开窗工具。另外,订单的开仓条件是针对当前工具而不是针对欧罗巴的。

- 是的,我想在当前窗口打开。

- 一个订单。在前一个订单关闭之前,下一个订单不会被打开。

"另外,订单 开仓条件是针对当前工具而不是欧标进行检查。" - 那么?

((OrderSymbol() == "EURUSD" )  ???
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
 
Alexey Belyakov:

- 是的,我想在当前窗口打开。

- 一个订单。在前一个订单关闭之前,下一个订单不会被打开。

"同时,订单 开仓条件 针对当前工具而不是针对欧元区进行检查。" - 那么?

然后呢,例如,你打开的窗口不是Eurobucks,而是Eurofunt,你将选定的订单符号与Eurobucks进行比较,如果是真的,那么Eurobucks上有一个订单,如果我们的magik,那么从OnStart函数中返回,如果不是,那么我们在Eurobucks上设置一个订单,但是Kloz、High、Ask、Bid在打开订单时将是一个错误,因为这些实例的Bid和Ask是不同的。而Symbol()将返回当前窗口的符号,不会发生错误。

你可以从元编辑器中使用一个模板,在左上方有一个新按钮。OnStart函数仍然被使用,但这是不对的,OnStart是为脚本服务的。正确的模板。

//+------------------------------------------------------------------+
//|                                                    forumtest.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                                  https://qstr.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://qstr.ru"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

正确的代码。你的订单注释缺失,魔术师也没有在你的代码中得到说明。

//+------------------------------------------------------------------+
//|                                                    forumtest.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                                  https://qstr.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://qstr.ru"
#property version   "1.00"
#property strict

datetime some_time=TimeCurrent();
//extern string Symbol3 = ""; //Инструмент (""текущий по умолчанию)
extern int P=1;          //Таймфрейм
extern int MagicNumber = 100500;  // Установили магик
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int send;
                                     
double SL=200;                                   
double TP=200;                       
double Lots=1;       

for(int i = OrdersTotal(); i >=0; i--)                                            // цикл для проверки ордеров
{
bool af=OrderSelect(i, SELECT_BY_POS,MODE_TRADES);     // OrderSelect возвращает тип bool                           
                                               // Шаг 1: OrderSelect Выбираем ордер 
                                   //(SELECT_BY_POS - по порядковому номеру), (MODE_TRADES -из отложенных и открытых)

if((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber))return; // Шаг 2: Если символ Выбранного ордера 
                                        //равен EURUSD (заменено на текущий инструмент открытого окна) ,
                                       // И если магик Выбранного ордера равен магик то выходим из функции Онстарт.
// Если же наш ордер не будет выбран из ордеров терминала, то цикл закончится и начнется выставление ордеров. 
                                                                                   
}
          

             
if ((Close[0]>High[1])) // клоз и хай здесь для текущего окна и инструмента. 
{
send=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,"My order",MagicNumber,0,clrGreen); // так же здесь цены аск и бид тоже для текущего инструмента

}

if ((Close[0]<Low[1]))  
{
send=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+SL*Point,Ask-TP*Point,"My order",MagicNumber,0,clrGreen); // и поинт кстати тоже.
}

return;
  }
//+------------------------------------------------------------------+
 
Valeriy Yastremskiy:

你的例子中存在许多错误

for(int i = OrdersTotal(); i >=0; i--)  

应该有。

for(int i = OrdersTotal()-1; i >=0; i--)  

这里的价格没有规范化OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,"My order",MagicNumber,0,clrGreen)。

这里我不明白的是,如果条件是假的,为什么需要从OnTick()退出的逻辑。

if((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber))return;

也许,我们应该继续循环,只计算订单的数量。

你的例子在逻辑上非常简单,很难为其他任务修改它...也许他想加个尾巴

原因: