新手的冒险 - 页 4

 

你好,mql的传奇人物。我在工作的午餐时间为你编写了伪代码。在这里。让我知道缺少什么,我就把它加进去。

N&P 伪装代码
在这个策略中,我们希望有一个代码,能够把它附加到任何图表上,它将在5种货币上运行,如果规则符合,在每一种货币上都进入空头和多头头寸。
---欧元兑美元-----
如果ema7>ema14>sma50,并且PriceNow<TopFilterLevel(例如:eurusd为1.3080,我将每天调整),那么。
买入欧元兑美元手数(手数是外部变量,例如0.01)。否则。(即不符合条件)不买。

如果ema7<ema14<sma50,并且PriceNow>BottomFilterLevel(例如:eurusd为1.1508),那么。
做空欧元兑美元多头(同样,外部变量)。否则(即条件未满足,不做空)。

如果买入头寸达到从进场点开始的20点,那么。在欧元兑美元上进行TAKEPROFIT。
如果做空头寸从进场点开始达到20个点,那么。在欧元兑美元上进行TAKEPROFIT。
如果没有达到20个点(无论是买入还是卖出),则继续在市场中存在,直到平仓。

手工操作。(最好是把这个放到OrderSend 函数中,以使代码更短)。

----GBPUSD---
与上述代码完全相同。

----USDJPY----
与上面相同


和上面一样

---澳元兑美元---
和上面一样

**代码的具体内容
如果符合上述条件,任何特定货币的买入和卖出交易都可以同时执行。
***此代码不需要止损。

**这个没有资金管理代码

那么,这看起来如何呢?

 
niko:

你好,mql的传奇人物。我在工作的午餐时间为你编写了伪代码。这里是。让我知道缺少什么,我就把它加进去。

N&P 伪装代码
在这个策略中,我们希望有一个代码,能够把它附加到任何图表上,它将在5种货币上运行,如果规则符合,在每一种货币上都进入空头和多头头寸。
---欧元兑美元-----
如果ema7>ema14>sma50,并且PriceNow<TopFilterLevel(例如:eurusd为1.3080,我将每天调整),那么。
买入欧元兑美元手数(手数是外部变量,例如0.01)。否则。(即不符合条件)不买。

如果ema7<ema14<sma50,并且PriceNow>BottomFilterLevel(例如:eurusd为1.1508),那么。
做空欧元兑美元多头(同样,外部变量)。否则(即条件未满足,不做空)。

如果买入头寸达到从进场点开始的20点,那么。在欧元兑美元上进行TAKEPROFIT。
如果做空头寸从进场点开始达到20个点,那么。在欧元兑美元上进行TAKEPROFIT。
如果没有达到20个点(无论是买入还是卖出),则继续在市场中存在,直到平仓。

手工操作。(最好是把这个放到OrderSend 函数中,以使代码更短)。

----GBPUSD---
与上述代码完全相同。

----USDJPY----
与上面相同


和上面一样

---澳元兑美元---
和上面一样

**代码的具体内容
如果符合上述条件,任何特定货币的买入和卖出交易都可以同时执行。
***此代码不需要止损。

**这个没有资金管理代码

那么,这看起来如何呢?

嘿,伙计们,关于编码的基本教程真的帮助我理清了思路(尽管详细的编码部分还很欠缺)。为了向你们展示我的忙碌,我附上了下面的代码。我认为这个想法是存在的,但它仍然返回很多错误。你会看到在Start()中所有的东西都在一个大括号里,我这样做的原因是,Mql一直出现错误,说变量不能全局声明,当我把所有的东西都放在一个括号里时,似乎停止了这个错误(尽管很多其他错误仍然存在)。我用notepad++来检查括号是否对齐。那么,我这样做至少是正确的吗?

//+------------------------------------------------------------------+
//|                                     N&P 1DailyUpTrendExec.mq4 |
//| Copyright Nick Lou & Pete Arh 2009                               |
//|                                     20090523                     |
//|                                                                  |
//+------------------------------------------------------------------+

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+


   //-------------------Declaring All Variables and Conditions


//--------------------declaration end


int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }


   // Order counting code
   // Return:  0 = no orders
   //          >0 = # long orders
   //          <0 = # short orders
      int CalcOpenOrders()
         {
         int long=0,short=0;
      for(int i=0; i<OrdersTotal(); i++)   
         //i set to 0 to stop bugs from
         //crawling in, i<Orderstotal means if i is behind the number of orders
         //in market then start counting orders and make i that number
         {
         if(OrderSelect( i, SELECT_BY_POS, MODE_TRADES)==false)break;
         //this function selects an order for further processing
         if(OrderType()==OP_BUY)long++;
         if(OrderType()==OP_SELL)short++;
         }
      if(long>0)return(long);
      if(short>0)return(-short);
      }

//------------ (fingers crossed this is right). I still don't get it why we need to count orders.


//--------------DECLARATION OF VARIABLES-------------------------
double ema1, ema2, ema3, closeup, e1over2, e2over3, e1under2, e2under3,
eurusdbuyok, eurusdshortok;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ()
   {
   ema1= iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,0);
   ema2= iMA(NULL,0,14,0,MODE_EMA,PRICE_CLOSE,0);
   ema3= iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);
   e1under2= ema1< ema2;
   e2under3= ema2< ema3;
   e1over2= ema1> ema2;
   e2over3= ema2> ema3;

   if(Bars<75)
      {
      Print("Bars less than 100");
      return(0);
      }


   //------------------EURUSD Block-------------------------
   //check order type, if it doesn't equal to buy already then buy


   //here i am setting a condition which will be
   //checked before a trade is opened, it shoudl state 'It's okay to enter
   //into long trade so long as there is either 1 order in place already or
   //none)
  
   // Call function. the returnvalue (output) of the function is stored into ReturnVal
   int ReturnVal = CalcOpenOrders();
  
   // Check output of function
   if ( ReturnVal >0)  // >0 = long orders. See CalcOpenOrders() 
      eurusdbuyok=1;
      else
      {
      eurusdbuyok=0;
      return(0);
      }

   if ( ReturnVal<0)   // <0 = short orders. See CalcOpenOrders()
      eurusdshortok=1;
      else
      {
      eurusdshortok=0;
      return(0);
      }


   //--------------condition ends

   if( eurusdshortok==1)
      {
      static int ticket;
      // deleted if(OrdersTotal()==0)
      if( e1under2 && e2under3)     // short function
         {
         ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"ShortOrder ",0,0,Red);
         if( ticket>0)
            {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
            Print("SHORT order opened : ",OrderOpenPrice());
            }
         }
      return(0);
      }



   //  -------------------------------------------------------------------------------------------
   if ( eurusdbuyok==1)
      {
      static int ticket1;
      // deleted if(OrdersTotal()==0)
      if( e1over2 && e2over3 && eurusdbuyok==1) //buy function
         {
         ticket1=OrderSend(Symbol(),OP_BUY, Lots,Ask,0,0,Ask+ TakeProfit*Point,"",0,0,Green);
         //What's 12345 for? I ADDED ASk-30*Point for stop loss
         if( ticket1>0)
            {
            if(OrderSelect( ticket1, SELECT_BY_TICKET, MODE_TRADES))
            Print("BUY order opened : ",OrderOpenPrice());
            }
         }
      return(0);
      }

   return(0);
   } 
这是最新版本的代码。从语法上看,一切都很好,但当我通过策略测试器运行时,没有返回任何交易,逻辑上有问题。我现在对代码已经相当熟悉了,好比说程序方面的结构。
 
niko wrote>>

你好,mql的传奇人物。我在工作的午餐时间为你编写了伪代码。在这里。让我知道缺少什么,我就把它加进去。

N&P 伪装代码
在这个策略中,我们希望有一个代码,能够把它附加到任何图表上,它将在5种货币上运行,如果规则符合,在每一种货币上都进入空头和多头头寸。
---欧元兑美元-----
如果ema7>ema14>sma50,并且PriceNow<TopFilterLevel(例如:eurusd为1.3080,我将每天调整),那么。
买入欧元兑美元手数(手数是外部变量,例如0.01)。否则。(即不符合条件)不买。

如果ema7<ema14<sma50,并且PriceNow>BottomFilterLevel(例如:eurusd为1.1508),那么。
做空欧元兑美元多头(同样,外部变量)。否则(即条件未满足,不做空)。

如果买入的头寸从进场点达到20点,那么。在欧元兑美元上进行TAKEPROFIT。
如果做空头寸从进场点开始达到20个点,那么。在欧元兑美元上进行TAKEPROFIT。
如果没有达到20个点(无论是买入还是卖出),则继续在市场中存在,直到平仓。

手工操作。(最好是把这个放到OrderSend 函数中,以使代码更短)。

----GBPUSD---
与上述代码完全相同。

----USDJPY----
与上面相同


和上面一样

---澳元兑美元---
和上面一样

**代码的具体内容
如果符合上述条件,任何特定货币的买入和卖出交易都可以同时执行。
***此代码不需要止损。

**这个没有资金管理代码

那么,这看起来如何呢?

嗨,尼科

作为第一次尝试,你的伪代码看起来很不错。

然而,我希望看到它更有条理,而且它给我提出了几个问题。

我能够很容易和快速地把它变成我自己通常会使用的那种格式。它作为一个文本文件附在这里,你可以看一下。你需要保存这个文件,并在记事本或类似的编辑器中打开它,以查看格式化。

请注意,在这个阶段,我们没有用任何特定的计算机语言来写。我们只是试图清楚明确地说明我们要做什么。

你可能会注意到,这些伪代码是相当具体和 "合法 "的。这就是我们必须与计算机对话的方式。我们需要非常清楚地说明我们希望它们做什么。否则,它们就会有产生垃圾的倾向。

你还会注意到 "块 "的使用,将事物排列成逻辑组。这些在以后可能很有用,可以帮助我们正确地构造代码。正如有人在前面的讨论中指出的,我们这样做并不是为了好玩。我们这样做是为了使代码更易读,更易理解,更易维护,最终更可靠和无缺陷。后者对于要用于实盘交易的软件来说是非常重要的,除非你有一箩筐的钱愿意扔掉 :).说真的,交易已经很困难了,不需要再处理有问题的软件。

请看一下我发给你的东西,如果你认为有必要,请随时进行修改。我的伪代码中缺少几个重要的点。你能发现它们吗?

你可能也想处理我在伪代码中提出的两个问题。我还想到了其他一些问题,但这些问题最好留到实际编码阶段再解决。

如果你还没有这样做,你可能想试试FXtrader2008在这次讨论中早些时候提到的Notepad++编辑器。使用任何你能找到的工具,使生活更容易一些。请将你修改后的伪代码以文本文件附件的形式发回给我。我发现在这个HTML编辑器中尝试写结构化代码,不管是伪代码还是其他,都有点乏味和混乱。

谢谢

蒂姆

附加的文件:
 
TSWilson:

嗨,尼科

对于第一次尝试,你的伪代码看起来很不错。

然而,我希望看到它的结构更合理一些,而且它给我提出了几个问题。

我能够很容易和快速地把它变成我自己通常会使用的那种格式。它作为一个文本文件附在这里,你可以看一下。你需要保存这个文件,并在记事本或类似的编辑器中打开它,以查看格式化。

请注意,在这个阶段,我们没有用任何特定的计算机语言来写。我们只是试图清楚明确地说明我们要做什么。

你可能会注意到,这些伪代码是相当具体和 "合法 "的。这就是我们必须与计算机对话的方式。我们需要非常清楚地说明我们希望它们做什么。否则,它们就会有产生垃圾的倾向。

你还会注意到 "块 "的使用,将事物排列成逻辑组。这些在以后可能很有用,可以帮助我们正确地构造代码。正如有人在前面的讨论中指出的,我们这样做并不是为了好玩。我们这样做是为了使代码更易读,更易理解,更易维护,最终更可靠和无缺陷。后者对于要用于实盘交易的软件来说是非常重要的,除非你有一箩筐的钱愿意扔掉 :).说真的,交易已经很困难了,不需要再处理有问题的软件。

请看一下我发给你的东西,如果你认为有必要,请随时进行修改。我的伪代码中缺少几个重要的点。你能发现它们吗?

你可能也想处理我在伪代码中提出的两个问题。我还想到了其他一些问题,但这些问题最好留到实际编码阶段再解决。

如果你还没有这样做,你可能想试试FXtrader2008在这次讨论中早些时候提到的Notepad++编辑器。使用任何你能找到的工具,使生活更容易一些。请将你修改后的伪代码以文本文件附件的形式发回给我。我发现在这个HTML编辑器中尝试写结构化代码,不管是伪代码还是其他,都有点乏味和混乱。

谢谢

蒂姆

嘿,TSW。谢谢你做这个。我可以看出你在这方面花了不少时间,所以我真的很感激。我附上了更新后的伪代码,但为了防止它没有附在上面,下面是它。我想看看你漏掉了什么,但我不太明白,我添加了一些东西,但它们只是对事物的澄清。


我们该从哪里着手?在我们创建这个 "适当的 "代码时,我仍在努力解决上面的代码的难题。它没有遵循我们的伪代码,因为它是一个旧的修补过的代码,但我仍然对它感到很困惑,因为它应该工作,至少对一种货币而言。最关键的是,以这种无组织的杂乱无章的方式构建它,让我学会了实际的编码元素(比如括号如何影响脚本,在哪里声明变量等等)。有什么想法,为什么这些代码不能像现在这样工作?

Program Title  - N&P Pseudo Code

START BLOCK - List of Currency Pairs

     EURUSD
     GBPUSD
     USDJPY
     USDCHF
     AUDUSD

END BLOCK - List Of Currency Pairs



START BLOCK - Configuration Parameters

      Set the value of TopFilterLevel manually on a daily basis for EURUSD
      Set the value of BottomFilterLevel manually on a daily basis EURUSD
      Set the value of TopFilterLevel manually on a daily basis for GBPUSD
      Set the value of BottomFilterLevel manually on a daily basis GBPUSD

      Set the value of TopFilterLevel manually on a daily basis for USDJPY
      Set the value of BottomFilterLevel manually on a daily basis USDJPY
      Set the value of TopFilterLevel manually on a daily basis for USDCHF
      Set the value of BottomFilterLevel manually on a daily basis USDCHF

      Set the value of TopFilterLevel manually on a daily basis for AUDUSD
      Set the value of BottomFilterLevel manually on a daily basis AUDUSD

      Set Lot size manually for All positions at once (same lot size)

END BLOCK - Configuration Parameters



START BLOCK  - Entry Rules

     If   the 7 Period Exponential Moving Average is greater than the 14 Period Exponential Moving Average  AND
          the 14 Period Exponential Moving Average is greater than the  50 period Simple Moving Average       AND
          Current Price   is less than TopFilterLevel  THEN
                       Signal a  BUY (Long) entry condition

     If   the  7 Period Exponential Moving Average is less than 14 Period Exponential Moving Average  AND
          the 14 Period Exponential Moving Average is less than the 50 period Simple Moving Average       AND
          Current Price   is less than  BottomFilterLevel  THEN
                       Signal a  SELL (Short) entry condition

     ***  Question ***
      What time periods do you want to use for your moving averages? Are the periods  Minutes, Hours, Days, Weeks, Months or  do they need to be variable?
***Answer *** Excellent question. It will be 5 minute periods for all moving averages, they do not need to be variable.

END BLOCK - Entry Rules
      


START BLOCK - Manual Close

      **** Question ***
      You say 
                  "Keep being in the market until the position is closed manually.
                   (ideall we put this into OrderSend function to keep code shorter)."
       
       What exactly do you want the program to do in this block?

***I was unclear on this before, my apologies. There should be no block as this in the code. I will exit positions manually when needed through the trade/terminal window (I assume that’s possible and won’t mess up the EA execution, right). So actually I don’t know if we need to code this flexibility or not? What do you think

END BLOCK - Manual Close  



START BLOCK  - Exit Rules

     If  any Open Position is greater than or equal to 20 pips from the entry level THEN
        Close the Position

END BLOCK  - Exit Rules



START BLOCK - Main  - This block controls the whole flow of the program
         With each Currency Pair in the List of Currency Pairs block do all of the following

                  Process the Exit Rules Block - 
                                    (Note that in practice this would normally just be the automatic execution of a Take Profit  Stop
                                    but we should mention it here in the pseudo code for completness. Of course you may have something else in mind
                                    such as using the program to close an open position—nope not for this code.)
                  Check the Entry Rules block  to see if a BUY or SELL  condition exists for this Currency Pair 

                  Check to see if  there is already  an open  BUY  position for this Currency Pair
                  Check to see if  there is already  an open SELL  position for this Currency Pair

                  If there is no open BUY position  for this currency pair   AND
                      a Buy condition exixts for this currency pair THEN
                              Open a BUY Position  for this currency pair
				Size: Pre-determined Lots

ELSE		If there is already 1 open BUY position for this currency pair		DO NOT OPEN BUY Position for this currency pair.

                   If there is no open SELL position  for this currency pair   AND
                      a SELL condition exixts for this currency pair THEN
                              Open a SELL Position  for this currency pair 
				Size predetermined lots.
  
ELSE		If there is already 1 sell position open for this currency pair		Do not open SELL Positions for this currency pair     
              
END BLOCK - Main 




PS: I will often use just 1 direction on a currency pair (eg: just short, for eurusd for 2 days for instance). How could we build this into the code. My assumption is I could just put ‘//’ infront of the parts of the code I don’t want to use (Eg: infront of buy or sell orders within each currency pair) and then remove them when I need to use that part of code next time. Will this work with a code structured in this way? 

**I can’t really think of anything you left out on purpose, to be honest. Unless it’s to check if there are sufficient funds for the trade, but that’s not necessary yet. Maybe in future versions of the strategy.
 
niko wrote>>

嘿,伙计们,关于编码的基本教程确实帮助我理清了思路(尽管详细的编码部分还很欠缺)。为了向你们展示我的忙碌,我附上了下面的代码。我认为这个想法是存在的,但它仍然返回很多错误。你会看到在Start()中所有的东西都在一个大括号里,我这样做的原因是,Mql一直出现错误,说变量不能全局声明,当我把所有的东西都放在一个括号里时,似乎停止了这个错误(尽管很多其他错误仍然存在)。我用notepad++来检查括号是否对齐。那么,我是否至少走对了路?

这是最新版本的代码。从语法上看,一切都很好,但当我通过策略测试器运行时,没有返回任何交易,逻辑上有问题。我现在对代码已经相当熟悉了,好比说程序的结构方面。

嘿,伙计们/姑娘们,在我学习如何以正确的方式完成上述代码(不是伪代码,而是代码)的时候,有什么帮助吗?

我今天进行了一次头脑风暴,我想也许错误在于有一个函数在计算订单,相反,也许我需要两个函数分别计算,一个计算买入,另一个计算卖出。我编写了下面的代码(改变了一些东西以考虑到这一点),你可以看到下面。但由于我还是一个完全的初学者,所以还是被搞得一团糟。对这个问题有什么想法吗?

//+------------------------------------------------------------------+
//|                                     N&P 1DailyUpTrendExec.mq4 |
//| Copyright Nick Lou & Pete Arh 2009                               |
//|                                     20090523                     |
//|                                                                  |
//+------------------------------------------------------------------+

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+


  //-------------------Declaring All Variables and Conditions


//--------------------declaration end


int init()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
  return(0);
}


  // Order counting code
  // Return:  0 = no orders
  //          >0 = # long orders
  //          <0 = # short orders
     int CalcOpenOrders()
        {
        int long=0,short=0;
     for(int i=0;i<OrdersTotal();i++)
        //i set to 0 to stop bugs from
        //crawling in, i<Orderstotal means if i is behind the number of orders
        //in market then start counting orders and make i that number
        {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)break;
        //this function selects an order for further processing
        if(OrderType()==OP_BUY)long++;
        if(OrderType()==OP_SELL)short++;
        }
     if(long>0)return(long);
     if(short>0)return(-short);
     }

//------------ (fingers crossed this is right). I still don't get it
why we need to count orders.


//--------------DECLARATION OF VARIABLES-------------------------
double ema1,ema2,ema3,closeup, e1over2, e2over3, e1under2, e2under3,
eurusdbuyok, eurusdshortok;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ()
  {
  ema1= iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,0);
  ema2= iMA(NULL,0,14,0,MODE_EMA,PRICE_CLOSE,0);
  ema3= iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);
  e1under2=ema1<ema2;
  e2under3=ema2<ema3;
  e1over2=ema1>ema2;
  e2over3=ema2>ema3;

  if(Bars<75)
     {
     Print("Bars less than 100");
     return(0);
     }


  //------------------EURUSD Block-------------------------
  //check order type, if it doesn't equal to buy already then buy


  //here i am setting a condition which will be
  //checked before a trade is opened, it shoudl state 'It's okay to enter
  //into long trade so long as there is either 1 order in place already or
  //none)

  // Call function. the returnvalue (output) of the function is
stored into ReturnVal
  int ReturnVal = CalcOpenOrders();

  // Check output of function
  if (ReturnVal >0)  // >0 = long orders. See CalcOpenOrders()
     eurusdbuyok=1;
     else
     {
     eurusdbuyok=0;
     return(0);
     }

  if (ReturnVal<0)   // <0 = short orders. See CalcOpenOrders()
     eurusdshortok=1;
     else
     {
     eurusdshortok=0;
     return(0);
     }


  //--------------condition ends

  if(eurusdshortok==1)
     {
     static int ticket;
     // deleted if(OrdersTotal()==0)
     if(e1under2 && e2under3)     // short function
        {
        ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point,"ShortOrder
",0,0,Red);
        if(ticket>0)
           {
           if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
           Print("SHORT order opened : ",OrderOpenPrice());
           }
        }
     return(0);
     }



  //  -------------------------------------------------------------------------------------------
  if (eurusdbuyok==1)
     {
     static int ticket1;
     // deleted if(OrdersTotal()==0)
     if(e1over2 && e2over3 && eurusdbuyok==1) //buy function
        {
        ticket1=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,Green);
        //What's 12345 for? I ADDED ASk-30*Point for stop loss
        if(ticket1>0)
           {
           if(OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES))
           Print("BUY order opened : ",OrderOpenPrice());
           }
        }
     return(0);
     }

  return(0);
  }

 
niko wrote>>

嘿,伙计们/姑娘们,在我学习如何以正确的方式完成上述代码(不是伪代码,而是代码)的时候,有什么帮助吗?

我今天进行了一次头脑风暴,我想也许错误在于有一个函数在计算订单,相反,也许我需要两个函数分别计算,一个计算买入,一个计算卖出。我编写了下面的代码(改变了一些东西以考虑到这一点),你可以看到下面。但由于我还是一个完全的初学者,所以还是被搞得一团糟。对这个问题有什么想法吗?

嗨,尼科

参照伪装代码

从代码上看。
***问题 ***
你想为你的移动平均线使用什么时间段?是分钟、小时、天、周、月还是需要可变的时间段?
***回答 *** 很好的问题。所有的移动平均线都是5分钟周期,它们不需要是可变的。

那么我建议在配置参数区的伪代码中加入这样的语句

"为指标使用5分钟时间框架"


你说。
***我之前对这个问题不清楚,我很抱歉。代码中不应该有这样的块。

我将在需要时通过交易/终端窗口手动退出头寸

(我想这是可能的,而且不会扰乱EA的执行,对吧)。

所以实际上我不知道我们是否需要编写这种灵活性的代码?你认为如何?


我建议你从伪代码中删除这个块。

对EA进行编码应该是没有问题的,这样你就可以使用终端来手动平仓,而不会搞乱任何东西。

你添加了这几行。

ELSE 如果该货币对已经有1个买入头寸,不要为该货币对开立买入头寸。

ELSE 如果该货币对已经有1个卖出头寸,不要为该货币对建立卖出头寸。


***问题 ***为什么你需要特别说明你不希望程序做什么,因为前面的几行只是

说明你想让程序做什么。在我看来,伪代码是仔细思考你的逻辑的地方。否则你可能会

当你开始实际编码时,就会陷入一片混乱。


你说。
PS:我经常在一个货币对上只使用一个方向(例如:只做空,比如说Eurusd,为期2天)。我们怎样才能在代码中建立这一点。我的假设是,我可以在我不想使用的代码部分前面加上'//'(例如:在每个货币对的买入或卖出订单前面),然后在我下次需要使用该部分代码时将其删除。这样的代码结构能行吗?


按照你的建议注释代码并不是一个非常优雅的方式。此外,如果你注释掉代码的 "LONG "部分,你就会注释掉所有货币对的多头头寸功能,除非你产生大量重复的代码。这也不是一个非常优雅的方式,很容易导致错误。

在一个特定的时期,你可能想做多欧元兑美元,做空英镑兑美元,而根本不交易美元兑瑞郎。这是很容易做到的,但我希望你能尝试一下,如何在伪代码中描述它自己。


这里有几个关于一种可能的方法的提示。

1.看看你的水平是如何设置和使用的

2.级别是以十进制数字表示的。对于 "去"/"不去 "的情况,通常的做法是使用另一种类型的表示方法,即布尔值或标志。是否有可能使用标志来完成你想做的事情?


你说。

**说实话,我真的想不出你故意遗漏了什么。除非是为了检查是否有足够的资金用于交易,但这还不是必须的。

也许在未来的策略版本中会有。


不,它不是关于检查是否有足够的资金。你特别说过没有资金管理,当然,除了指定手数。这是更基本的东西。

你需要哪些项目的信息来下单?这些项目在哪里以及如何在伪装的代码中描述和处理?


你说。

我们从哪里开始呢?当我们正在创建这个 "适当 "的代码时,我仍在试图解决上述代码的难题。它没有遵循我们的伪代码,因为它是一个旧的修补过的代码,但我仍然对它感到相当困惑,因为它应该工作,至少对一种货币来说。最关键的是,以这种无组织的杂乱无章的方式构建它,让我学会了实际的编码元素(比如括号如何影响脚本,在哪里声明变量等等)。有什么想法,为什么那段代码不能像现在这样工作?


我理解你的挫折感。我快速看了一下旧的代码,但坦率地说,你想做的事情在逻辑上没有什么意义。我可以在15分钟内重写这段代码,它就能做到你想要的,但这不是重点,对吗?你说你想学习写代码。我正在努力指导你如何为自己做这件事。


尼科,我不认为你离开始写一些(新的)适当的代码太远了,但重要的是先把 "你想做什么 "准确地钉在伪代码上。

这将使编码 "容易得多",你很快就会看到。


保持良好的工作状态

谢谢

蒂姆

 

嗨,蒂姆。


像往常一样,我真的很感谢你和我在一起的时间。我将继续修改伪代码,以反映你的意见。关于真正的代码,不用担心,让我们好好做吧(我只是有时有点不耐烦:),因为学习比任何事情都更有力量。

 

嘿,蒂姆。


我又看了一遍伪代码,并在我的新手大脑中做了尽可能多的工作。请看附件,我期待着你的评论!

附加的文件:
 
niko wrote>>

嘿,蒂姆。

我又看了一遍伪代码,并在我的新手大脑中做了尽可能多的工作。请看附件,我期待着你的评论。

嗨,尼克

这一切看起来都很好。

我浏览了你最新的伪代码,回答了一些问题等等。

我想我们差不多可以开始编码了。


作为一个非常粗略的经验法则,他们说1/3的编程时间应该用于规范,1/3用于编码,1/3用于调试和测试。


所以我们可以说,我们现在大概已经完成了这个小项目的1/3了

现在让我们谈谈MT4语言。


所有的计算机语言都有特定的方式(一种格式),必须用这种方式来编写语言,以便计算机能够理解你试图指示它做什么。你可以从文档中了解到这一点和其他语言的具体信息。MT4的文档可以在这个论坛上找到。如果你还没有这样做,我建议你花一些时间看看文档中的信息。然后,当你需要某些特定主题或功能的信息时,你就会知道到哪里去找它。


为了使生活更轻松,许多现代计算机语言(包括MT4)都使用模板,为您设置基本的程序布局。这些模板程序通常被称为 "向导"。你可以在MetatEditor的 "New "菜单项下找到EA向导,上面有一个绿色的十字。


如果你打开它,你会发现一个 "专家顾问 "的模板。选择它,你会被提示输入EA名称、作者详情等和参数。这些参数可以在以后添加或更改,但在这个阶段,你可能想从配置块中输入参数。

您需要给每个参数一个名称,一个类型和一个初始值。


参数名称应始终描述它们是什么


例如,EURUSD_TopFilterLevel是一个有意义的名字ex1 IS NOT。使用有意义的数据名称使程序更容易理解调试或以后的修改。请注意,在MT4中,数据名称是区分大小写的。LOTSize与LotSize不一样。你需要小心翼翼地使用数据名称,并保持一致。


您还需要为每个参数指定一个数据类型(type)。MT4只使用4种数据类型 整数(int),小数(double),文本(string)和真/假或标志(bool)。


同样,我们需要注意数据类型,不要在不知情的情况下把它们混为一谈,否则会带来微妙的错误。


一旦你用向导创建了你的模板,我建议你开始 "构建 "你的程序。MT4的基本结构单元是函数。




void MyBasicFunction()

{

}


metatrader向导生成的模板中已经有三个空函数。



int init()

{

返回(0)

}



init deinit()

{

返回(0)

}



int start()

{

返回(0)

}


当您把EA拖到图表上并点击专家顾问按钮时,每次启动时都会调用init 函数。

当您把EA从图表上拖下来或点击专家顾问按钮关闭时,每次都会调用deinit 函数。


函数 开始 函数在它所连接的图表收到每一个新的TICK时被调用。这意味着,根据市场的繁忙程度,它可以在一分钟内被调用数次或更多。这就是我们要做的大部分工作的地方。


就目前而言,我建议你把主块中的所有伪代码放到启动函数中,然后在每一行用//注释掉伪代码。


然后为入口规则块创建一个自己的新函数,并以同样的方式注释出其中的伪代码。


暂时让init和deint函数为空,保持原样。


你应该能够在没有错误的情况下编译这段代码,当然,在这个阶段,它不会做任何事情。


保持良好的工作状态!


注意事项

蒂姆

(PS 如果需要的话,我们可以在skype上交谈,但我们暂时先看看我们在论坛上的表现)

附加的文件:
 

嗨,蒂姆。

像往常一样,你的帮助和时间是非常宝贵的!为了表示感谢,一旦我们完成了编码过程,我希望你能送你一瓶非常好的香槟酒。

是的,我已经把mql的书看了好几遍,困难的是把理论付诸实践。我还打印了这个网站上发布的10个左右的EA,看看它们是如何编码和组合的,以尝试和理解它们。我还花了很多时间在MT4的模拟交易器上(即回测 和学习已有的EA)。

我将开始编码过程,并使块非常清晰和独立,以帮助我们两个人看到发生了什么。然后通过论坛发给你。

1个问题。你说过经纪公司会采取一些措施来阻止攻击性打压。1.你是如何定义攻击性拍打的?2.他们有什么措施?

我曾经在1分钟的时间段内手动剥金牛座的头皮(使用spreadbetting方法),这进行得非常好,直到经纪商点击并开始为执行(进入和退出)设置延迟。所以现在在这个经纪商那里做这个根本没有意义,即使它是非法的,延迟仍然会发生,并把整个一天搞得一团糟(比如你通常只做1小时的头皮,2次延迟就会失去宝贵的时间)。在积极威胁要采取法庭行动后,我拿回了所有延迟交易的钱。

2 问题。你使用不同的经纪商吗?你会推荐哪些经纪商?(如果你被允许在这里提到名字)。

谢谢。

昵称