Пожалуйста, проконсультируйте меня относительно спреда - страница 4

 
deysmacro:
Однако вы должны помнить. Советник закрывает только текущие сделки. Вы должны открыть сделку самостоятельно.

100%, нет проблем, скорее это именно то, чего я пытаюсь достичь... я не хочу, чтобы советник открывал любую сделку, это моя работа... я просто хочу, чтобы он закрывал ее, если открыто более 2 ордеров с прибылью X и должен учитывать спред! Постепенно я приближаюсь к этому... этому программированию должны были учить в школах... жаль, что я из 80-х, никогда не думал, что мне придется пройти через это, но чем больше я читаю файл помощи, я нахожу это все более и более интригующим... также, на этом форуме есть много помощи, благодаря таким парням, как вы.
 
tatyawinchu:

что если я могу добавить цикл IF, а затем вставить остальную часть кода ниже, который запускает цикл?

Условие IF должно проверять OrdersTotal, чтобы быть => 2, так что контроль передается, чтобы закрыть все открытые ордера с прибылью X после спреда?



Я не уверен, что вы действительно имеете в виду "Условие IF должно проверить OrdersTotal, чтобы быть => 2, так что контроль передается, чтобы закрыть все открытые ордера с X прибылью после спреда".

но я уверен, что ничего страшного не произойдет, если вы попробуете. А если не получится, то терять нечего. По крайней мере, вы попытались.

 
tatyawinchu:

100%, нет проблем, скорее это именно то, чего я пытаюсь достичь... я не хочу, чтобы советник открывал любую сделку, это моя работа... я просто хочу, чтобы он закрывал ее, если открыто более 2 ордеров с прибылью X и должен учитывать спред! Медленно я приближаюсь к этому... этому программированию должны были учить в школах... жаль, что я из 80-х, никогда не думал, что мне придется пройти через это, но чем больше я читаю файл помощи, я нахожу это все более и более интригующим... также, на этом форуме есть много помощи, благодаря таким парням, как вы.

Просто включите спред в totalprofit.
 
thrdel:


Я не уверен, что вы действительно имеете в виду "Условие IF должно проверить, что OrdersTotal => 2, чтобы управление было передано для закрытия всех открытых ордеров с прибылью X после спреда".

но я уверен, что ничего страшного не произойдет, если вы попробуете. А если не получится, то терять нечего. По крайней мере, вы попытались.


Я не уверен, что вы действительно имеете в виду "Условие IF должно проверить, что OrdersTotal => 2, чтобы управление было передано на закрытие всех открытых ордеров с прибылью X после спреда".

Хм... Хорошо, что я имею в виду под этим

ЕСЛИ ... общее количество открытых ордеров больше или равно 2 ... только тогда идите вперед и следуйте остальной части кода...

Если общее количество открытых ордеров [ OrdersTotal() ?? ] ... меньше 2 ... то есть либо 1, либо 0, то ничего не делать ...

Теперь, вот в чем проблема для меня, в файле справки mql 4 говорится, что OrdersTotal() считает все ордера, рыночные и отложенные... Я пытаюсь найти какую-то функцию, которая может получить только рыночные ордера, а не отложенные, ИЛИ, это может быть вычислено математически, так как в основном у меня только максимум 2 сделки одновременно.

Это объяснение более понятно?

Спасибо за время, которое вы мне уделяете.

 

thrdel хочет, чтобы вы сначала попробовали и посмотрели, что произойдет, хотя я почти уверен, что скорее всего произойдет.

 
deysmacro:

thrdel хочет, чтобы вы сначала попробовали и посмотрели, что произойдет.



Да, просматриваю файл справки, чтобы найти нужную функцию, которая дает только открытые ордера.
 
Покажите нам свой код, когда вам удастся его завершить, и мы поможем вам, если сможем.
 
deysmacro:
Покажите нам ваш код, когда вам удастся его завершить, и мы поможем вам, если сможем.

Понял! Спасибо большое...

..

и я не смог найти функцию, которая возвращает только открытые сделки ... Это нормально, поэтому я добавил цикл IF, как показано ниже...

//+------------------------------------------------------------------+
//|                    CloseTrades_After_Account_Profit_Reached.mq4  |
//|                                     Copyright © 2007, Tradinator |
//|                                          tradinator.fx@gmail.com |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2007, Tradinator"
#property link      "tradinator.fx@gmail.com"


                                       
extern double My_Money_Profit_Target=100;     //The amount of money profit at which you want to close ALL open trades.
extern string Profit_Target= "Enter above To Close all OPEN trades when amount of profit is Reached in Account and not per OPEN trade! ";
                                          
int Slippage=5;
int i;

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


int start()

//+------------------------------------------------------------------+
//| This is just the single line of code that I have added
//+------------------------------------------------------------------+
{ 
 if (OrdersTotal()>=2)

 {
   if (AccountProfit()>= My_Money_Profit_Target)
   {
    for(i=OrdersTotal()-1;i>=0;i--)
       {
       OrderSelect(i, SELECT_BY_POS);
       int type   = OrderType();
               
       bool result = false;
              
       switch(type)
          {
          //Close opened long positions
          case OP_BUY  : result = OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),Slippage,Pink);
                         break;
               
          //Close opened short positions
          case OP_SELL : result = OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),Slippage,Pink);
                          
          }
          
       if(result == false)
          {
            Sleep(0);
          }  
       }
      Print ("Account Profit Reached. All Open Trades Have Been Closed");
      return(0);
   }  
   
   Comment("Balance: ",AccountBalance(),", Account Equity: ",AccountEquity(),", Account Profit: ",AccountProfit(),
           "\nMy Account Profit Target: ",My_Money_Profit_Target);
   
  return(0);
   }
 }

Я добавил условие IF в начале, которое идет if (OrdersTotal()>=2) ... [ Выделено в приведенном выше коде с комментарием ].

Теперь возникла проблема с закрытием {}, так как при первой попытке я попытался сделать это как

{ 
 if (OrdersTotal()>=2)
}

 {
   if (AccountProfit()>= My_Money_Profit_Target)
   {
    for(i=OrdersTotal()-1;i>=0;i--)
       { .. etc etc 
     

поэтому, как начинающий кодер, я попытался вынести условие if на проверку ПЕРВЫМ... не скомпилировалось...

Поэтому я закрыл {}, получив условие внутри... теперь он компилируется только с 2 предупреждениями и без ошибок...

возвращаемое значение 'OrderSelect' должно быть проверено Testcode 1.mq4 56 8

не все пути управления возвращают значение Testcode 1.mq4 86 2

Итак, он компилируется... логически корректен ли он?

[Кроме того, я не удаляю информацию об авторских правах, я просто добавляю строку, удаление его данных было бы совершенно нечестным с моей стороны... каковы правила на этот счет? ]

 
tatyawinchu:

Да, просматриваю файл справки, чтобы найти нужную функцию, которая дает только открытые ордера.


Мне очень жаль, но, как я уже говорил, я не очень хорошо умею объяснять. Я понимаю, что вы хотите найти функцию, которая будет считать только открытые ордера на покупку или продажу, я попросил вас посмотреть на мой код, я объяснил его вам в меру своих возможностей и оказался не так хорош, как надеялся.

Помните ли вы первый шаг, который я упомянул об этом коде?

Это было CountMyOrders. Теперь, если вы посмотрите на код, как я вас просил, вот что вы найдете.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double CountMyOrders()
  {
   myOrders=0;
   for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==false)
         Print("Failed to select order, error : "+ErrorDescription(GetLastError()));
      //skip orders placed by other EA's
      if(OrderMagicNumber()>0)continue;
      if(OrderType()==OP_BUY || OrderType()==OP_SELL)
        {
         myOrders++;
        }
     }
   return(myOrders);
  }

Здесь говорится

if(OrderType()==OP_BUY || OrderType()==OP_SELL)

Вы должны знать, что означает OP_BUY и OP_SELL.

Никакие отложенные ордера не считаются, нет открытого стопа покупки, нет открытого стопа продажи, нет лимита покупки или лимита продажи, только открытые покупки и открытые продажи.

Как еще я могу лучше объяснить этот кусок кода и то, что он делает?

Вы можете продолжать искать в документации и знакомиться с ней, но я могу сказать, что функции, которую вы ищете, там нет.

Мой советник говорит, что если ордеров еще нет, подождите:

if(myOrders<1)

Вы хотите, чтобы советник ждал 2 ордера. Если бы вы уделили немного внимания тому, что я сказал, вы бы заметили, что все, что вам нужно сделать, это :

if(myOrders<2)

Voilla. Теперь он ждет, пока 2 ордера будут на месте - никаких отложенных, только покупка или продажа!

Пожалуйста, поймите, что я пытался собрать этот код, чтобы он подошел и другим, кто ищет способ управления открытыми сделками, а не был разработан для конкретной цели.

Он предназначен как пример, возьмите то, что вы считаете хорошим, оставьте остальное, улучшите его, измените его, учитесь на нем, если можете, и экспериментируйте с ним.

Надеюсь, это имеет смысл.

 
thrdel:


Мне очень жаль, но, как я уже говорил, я не очень хорошо умею объяснять. Я понимаю, что вы хотите найти функцию, которая будет считать только открытые ордера на покупку или продажу, я попросил вас посмотреть на мой код, я объяснил его вам в меру своих возможностей и оказался не так хорош, как надеялся.

Помните ли вы первый шаг, который я упомянул об этом коде?

Это было CountMyOrders. Теперь, если вы посмотрите на код, как я вас просил, вот что вы найдете.

Здесь говорится

Вы должны знать, что означает OP_BUY и OP_SELL.

Никакие отложенные ордера не считаются, нет открытого стопа покупки, нет открытого стопа продажи, нет лимита покупки или лимита продажи, только открытые покупки и открытые продажи.

Как еще я могу лучше объяснить этот кусок кода и то, что он делает?

Вы можете продолжать искать в документации и знакомиться с ней, но я могу сказать, что функции, которую вы ищете, там нет.

Мой советник говорит, что если ордеров еще нет, подождите:

Вы хотите, чтобы советник ждал 2 ордера. Если бы вы уделили немного внимания тому, что я сказал, вы бы заметили, что все, что вам нужно сделать, это :

Voilla. Теперь он ждет, пока 2 ордера будут на месте - никаких отложенных, только покупка или продажа!

Пожалуйста, поймите, что я пытался собрать этот код, чтобы он подошел и другим, кто ищет способ управления открытыми сделками, а не просто был разработан для конкретной цели.

Он предназначен как пример, возьмите то, что вы считаете хорошим, оставьте остальное, улучшите его, измените его, учитесь на нем, если можете, и экспериментируйте с ним.

Надеюсь, это имеет смысл.

Спасибо большое... Во-первых, это не вы! Это все я! хехе, я здесь новичок... ваши объяснения идеальны! просто сейчас немного трудно переварить, так как я иду шаг за шагом... слово за словом через файлы справки =) и прошу помощи, когда застреваю... Скорее, теперь из-за вашего кода, я читаю раздел ФУНКЦИИ в файле справки! ! Также, не могли бы вы скомпилировать код, который я вставил выше, с вашей стороны и посмотреть, есть ли что-то неправильное в логике этого условия IF? Опустим сейчас, что он считает все ордера... скажем, если этот советник выполняется, когда не было открыто ни одного ордера, затем открывается первый ордер и через некоторое время срабатывает другой ордер... правилен ли логический поток этого условия IF? Кроме того, теперь я почти уверен, что этот код нуждается в исправлении одной строчки[Также, я отказался от идеи разместить это как работу...], мне не нужно усложнять его, чтобы сканировать, пропускать или нет ордера от других советников, потому что для меня это будет единственный работающий советник, поэтому мне не нужно специально присваивать магический номер каждому ордеру и т.д... теперь мне просто нужно выяснить, верна ли логика моего IF ^^.
Причина обращения: