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

 
GumRai:

Я думаю, что это можно закодировать за 20 или 30 долларов.

Точно... спасибо... Давайте я посмотрю, смогу ли я сначала найти что-нибудь бесплатно, если я ничего не найду, я опубликую работу.
 
GumRai:

Я думаю, что это можно сделать за 20 или 30 долларов.

На самом деле, поскольку теперь вы подтвердили, что закрытие ордера уже учитывает спред, я думаю, что приведенный выше скрипт должен работать для меня... спасибо... Все, что мне нужно установить в нем, это 10 пунктов... и он будет автоматически закрывать его, как вы сказали, используя значение ASK, если это шорт, и используя значение BID, если это лонг... и суммирует это как общую прибыль счета и закрывает все открытые ордера.. не трогает отложенный ордер, так что все хорошо... спасибо большое... также, не могли бы вы объяснить мне... в вышеуказанной программе говорится о проскальзывании = 5... что это значит для этого скрипта? как это отразится на том, когда скрипт закрывает ордер? о, и еще, это скрипт или советник? или как отличить одно от другого? [ КАК ВЫ, РЕБЯТА, ТАК МНОГО ВСЕГО УЗНАЕТЕ >.< ].
 
tatyawinchu:

Спасибо большое... очень ясно и очень полезно... Интересно, сколько будет стоить разместить такую работу? Насколько сложным, по вашей оценке, может быть такой код? Код, который я получил из Интернета и который я разместил выше, выглядит ОГРОМНЫМ... Я имею в виду, что я действительно не могу выложить тысячи долларов...


Здравствуйте еще раз,

Не стоит беспокоиться, код для того, что вы хотите, не должен быть таким сложным и, просто чтобы вы знали, если вам когда-нибудь понадобится разместить работу, вы единственный, кто контролирует, вы предлагаете, сколько вы можете себе позволить и вы думаете, что это стоит!

С другой стороны, если вы похожи на меня, я бы сначала попробовал бесплатный вариант. Ничего не потеряете, возможно, приобретете несколько друзей и чему-то научитесь в процессе.

Ваше здоровье

 
tatyawinchu:

На самом деле, поскольку теперь вы подтвердили, что закрытие ордера уже учитывает спред, я думаю, что приведенный выше скрипт должен работать для меня... спасибо... Все, что мне нужно установить в нем, это 10 пунктов... и он будет автоматически закрывать его, как вы сказали, используя значение ASK, если это шорт, и используя значение BID, если это лонг... и суммирует это как общую прибыль счета и закрывает все открытые ордера.. не трогает отложенный ордер, так что все хорошо... спасибо большое... также, не могли бы вы объяснить мне... в вышеуказанной программе говорится о проскальзывании = 5... что это значит для этого скрипта? как это повлияет на то, когда скрипт закрывает ордер? о, и еще, это скрипт или советник? или как отличить одно от другого? [ КАК ВЫ, РЕБЯТА, ТАК МНОГО ВСЕГО УЗНАЕТЕ >.< ]


Привет еще раз,

Как всегда, есть хорошие и плохие новости. Хотите сначала плохую новость или хорошую?

Вот она, и если я недостаточно хорошо объяснил, пожалуйста, дайте мне знать: Чтобы советник мог выходить из сделок на основе прибыли счета, ему нужно знать, каким был капитал счета до заключения сделки, чтобы иметь отправную точку. Есть ли в этом смысл?

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

Есть ли в этом какой-то смысл?

Проскальзывание - это максимальное отклонение от цены, которое вы позволяете брокеру разместить или закрыть ордер без повторной котировки, если вы открываетесь или закрываетесь по рыночной цене. Поскольку Bid и Ask постоянно меняются, к тому времени, когда ваш ордер достигает сервера, если значение цены (bid или ask) находится в пределах проскальзывания, ордер будет обработан, в противном случае он будет повторно котирован.

Да, ваш код - это советник. Скрипт обычно запускается только один раз, вы получаете новый тик, выполняете код и выходите. Советник работает непрерывно, пока вы позволяете ему работать.

Как вы их различаете? Иногда это сложно, поскольку они работают одинаково. Когда создается новый скрипт, он выглядит следующим образом:

//+------------------------------------------------------------------+
//|                                                   TestScript.mq4 |
//|                             Copyright 2014, 3D@tm Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, 3D@tm Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   
  }
//+------------------------------------------------------------------+

Вы можете видеть, что у него есть только функция OnStart и написано: Script program start function.

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

Стоимость пункта (деньги за пункт) не одинакова для всех валют. Пункт в паре AUDUSD не имеет такой же стоимости, как в паре GBPJPY.

Вы ищете конкретные символы для этого советника или, независимо от символа, просто закрыть все ордера, когда прибыль на счете достигнута?

Кроме того, стоп-лосс должен быть связан с капиталом счета или с ордером/парой?

Я знаю, что это звучит сложно, но это не так уж и сложно. Наши компьютеры настолько тупы, что если вы не укажете точно, что вы хотите, они потеряются.

Помогло ли это вам? Надеюсь, что помогло.

Будь здоров

 

Thrdel

Я почти уверен, что AccountProfit() возвращает общую прибыль по текущим открытым сделкам. Хотя это не очевидно из документации.

 
GumRai:

Thrdel

Я почти уверен, что AccountProfit() возвращает общую прибыль по текущим открытым сделкам. Хотя это не очевидно из документации.


Хм ...

 AccountProfit() 

Вместо этого я использую ...

double AccProfits=AccProfits+OrderProfit();

Зависит от того, чего вы хотите добиться.

 
GumRai:

Thrdel

Я почти уверен, что AccountProfit() возвращает общую прибыль по текущим открытым сделкам. Хотя это не очевидно из документации.


Привет, ГумРай,

Вы правы, не очень очевидно из документации, но я проверил это и снова вы правы, это сумма прибыли/убытка по всем открытым ордерам.

Отличная находка. Спасибо.

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

Думаю, выбор по магическому числу = 0 должен сработать. А затем суммировать прибыль, как предложил deysmacro .

Думаю, я вижу это так. Что вы думаете, ребята?

//+------------------------------------------------------------------+
//|                                       CloseOrdersOnProfit_v1.mq4 |
//|                             Copyright 2014, 3D@tm Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, 3D@tm Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//---
#include <stdlib.mqh>
//---
#define  RETRYCOUNT    10
#define  RETRYDELAY    500
#define  LONG          1
#define  SHORT         -1
#define  ALL           0
//---
extern int     Slippage=3;
input  double  ProfitTarget=100.0;
input  double  StopLossLimit=50.0;
input  bool    WriteScreenshots=true;
//---
double StartEquity=0;
int    myOrders;
//===================================================================
/*
This EA will manage manually placed orders and skip the orders that
have a magic number different from zero.
If the Profit target - the sum of profit/loss on all orders (except
orders placed by other EA's ) is reached, all those orders are
closed.
If the maximum amount of money allowed for a loss is reached, EA
will close all those orders and an alert will pop up.
*/
//===================================================================
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(Digits==3 || Digits==5) Slippage*=10;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- count orders manually placed (no magic number)
   CountMyOrders();
//--- reset account equity / take a reference point
   if(myOrders<1)
     {
      StartEquity=AccountEquity();
      //--- no orders detected, wait for orders to be placed
      return;
     }
//--- calculate profit
   double myProfit=CalculateProfit();
//--- if profit target reached, exit all
   if(myProfit>=ProfitTarget)
     {
      ExitAll(ALL);
      Alert("Orders closed due to profit target reached");
     }
//--- exit if stop limit reached
   if(StartEquity-AccountEquity()>=StopLossLimit)
     {
      ExitAll(ALL);
      Alert("Orders closed due to stop loss limit reached");
     }

   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double CalculateProfit()
  {
   double Profit=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)
        {
         Profit=Profit+OrderProfit();
        }
     }
   return(Profit);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ExitAll(int direction)
  {

   string total=IntegerToString(OrdersTotal(),0,0);

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      Comment(StringConcatenate("Closing trade #",(i+1)));
      if(OrderSelect(i,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 &&(direction==LONG ||  direction==ALL)) { Exit(OrderSymbol(),OrderTicket(),LONG,OrderLots(),Blue); }
      if(OrderType()==OP_SELL &&(direction==SHORT|| direction==ALL)) { Exit(OrderSymbol(),OrderTicket(),SHORT,OrderLots(),Red); }
     }
   Comment(StringConcatenate(total," trades closed."));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Exit(string symb ,int ticket,int dir,double volume,color clr,int t=0)
  {
   int i=0,j=0,cmd=0;
   double prc=0,sl=0,tp=0,lots=0;
   string cmt;
   double bid=MarketInfo(symb,MODE_BID);
   double ask=MarketInfo(symb,MODE_ASK);
   bool closed;

   Print("Exit("+IntegerToString(dir,0,0)+","+DoubleToStr(volume,3)+","+IntegerToString(t,0,0)+")");

   for(i=0; i<RETRYCOUNT; i++) 
     {
      for(j=0;(j<50) && IsTradeContextBusy(); j++)
         Sleep(100);
      RefreshRates();

      if(dir==LONG) 
        {
         prc=bid;
        }
      if(dir==SHORT) 
        {
         prc=ask;
        }
      Print("Exit: prc="+DoubleToStr(prc,Digits));

      closed=OrderClose(ticket,volume,prc,Slippage,clr);
      if(closed)
        {
         Print("Trade closed");
         Screenshot("Exit");

         return (true);
        }

      Print("Exit: error \'"+ErrorDescription(GetLastError())+"\' when exiting with "+DoubleToStr(volume,3)+" @"+DoubleToStr(prc,Digits));
      Sleep(RETRYDELAY);
     }

   Print("Exit: can\'t enter after "+IntegerToString(RETRYCOUNT,0,0)+" retries");
   return (false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Screenshot(string moment_name)
  {
   if(WriteScreenshots)
      WindowScreenShot(WindowExpertName()+"_"+Symbol()+"_M"+IntegerToString(Period(),0,0)+"_"+
                       IntegerToString(Year(),0,0)+"-"+two_digits(Month())+"-"+two_digits(Day())+"_"+
                       two_digits(Hour())+"-"+two_digits(Minute())+"-"+two_digits(Seconds())+"_"+
                       moment_name+".gif",1024,768);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string two_digits(int i)
  {
   if(i<10)
      return ("0"+IntegerToString(i,0,0));
   else
      return (""+IntegerToString(i,0,0));
  }
//+------------------------------------------------------------------+
 
thrdel:


Привет GumRai,

Вы правы, это не очень очевидно из документации, но я протестировал это и снова вы правы, это сумма прибыли/убытка по всем открытым ордерам.

Отличная находка. Спасибо.

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

Думаю, выбор по магическому числу = 0 должен сработать. А затем суммировать прибыль, как предложил deysmacro .

Думаю, я вижу это так. Что вы думаете, ребята?


это не работает .....

Для большого количества сделок prc не является подходящей ценой.

также не стоит

  if(Digits==3 || Digits==5) Slippage*=10;

если вы меняете несколько раз ваш таймфрейм ......

 
deVries:


это не работает .....

для многих сделок prc не является подходящей ценой

также не делайте

если вы несколько раз меняете свой таймфрейм .......


Да, деВрис,

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

Вы же понимаете, что этот код - не коммерческий советник, предназначенный для продажи привередливому клиенту, верно? Мы пытаемся что-то решить, и если вы не хотите помочь, то хотя бы оставьте это в покое.

Вы действительно считаете, что если я несколько раз изменю временной интервал..... что? Проскальзывание будет 3000000? Не в моем MT4, очевидно. И если вы мне не верите, проведите тест сами.

Мой тест говорит, что когда вы меняете таймфреймы, советник проходит цикл deinit/init, и так как упомянутый код находится в OnInit, Slippage каждый раз будет на уровне 30 пунктов.

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

И нет, это не поддельная картинка, она реальная, вы можете проверить время смены каждого таймфрейма.

Надеюсь, это поможет.

 
thrdel:


Еще раз здравствуйте,

Как всегда, есть хорошие и плохие новости. Хотите сначала плохую новость или хорошую?

Вот она, и если я недостаточно хорошо объяснил, пожалуйста, дайте мне знать: Чтобы советник мог выходить из сделок на основе прибыли счета, ему нужно знать, каким был капитал счета до заключения сделки, чтобы иметь отправную точку. Есть ли в этом смысл?

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

Есть ли в этом какой-то смысл?

Проскальзывание - это максимальное отклонение от цены, которое вы позволяете брокеру разместить или закрыть ордер без повторной котировки, если вы открываетесь или закрываетесь по рыночной цене. Поскольку Bid и Ask постоянно меняются, к тому времени, когда ваш ордер достигает сервера, если значение цены (bid или ask) находится в пределах проскальзывания, ордер будет обработан, в противном случае он будет повторно котирован.

Да, ваш код - это советник. Скрипт обычно запускается только один раз, вы получаете новый тик, выполняете код и выходите. Советник работает непрерывно, пока вы позволяете ему работать.

Как вы их различаете? Иногда это сложно, поскольку они работают одинаково. Когда создается новый скрипт, он выглядит следующим образом:

Вы можете видеть, что у него есть только функция OnStart и написано: Script program start function.

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

Стоимость пункта (деньги за пункт) не одинакова для всех валют. Пункт в паре AUDUSD не имеет такой же стоимости, как в паре GBPJPY.

Вы ищете конкретные символы для этого советника или, независимо от символа, просто закрыть все ордера, когда прибыль на счете достигнута?

Кроме того, стоп-лосс должен быть связан с капиталом счета или с ордером/парой?

Я знаю, что это звучит сложно, но это не так уж и сложно. Наши компьютеры настолько тупы, что если вы не укажете точно, что вы хотите, они потеряются.

Помогло ли это вам? Надеюсь, что помогло.

Будь здоров


Трдель:


Здравствуйте еще раз,

Как всегда, есть хорошие и плохие новости. Хотите сначала плохую новость или хорошую?

Вот она, и если я недостаточно хорошо объяснил, пожалуйста, дайте мне знать: Чтобы советник мог выходить из сделок на основе прибыли счета, ему нужно знать, каким был капитал счета до заключения сделки, чтобы иметь отправную точку. Есть ли в этом смысл?

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

Есть ли в этом какой-то смысл?

Проскальзывание - это максимальное отклонение от цены, которое вы позволяете брокеру разместить или закрыть ордер без повторной котировки, если вы открываетесь или закрываетесь по рыночной цене. Поскольку Bid и Ask постоянно меняются, к тому времени, когда ваш ордер достигает сервера, если значение цены (bid или ask) находится в пределах проскальзывания, ордер будет обработан, в противном случае он будет повторно котирован.

Да, ваш код - это советник. Скрипт обычно запускается только один раз, вы получаете новый тик, выполняете код и выходите. Советник работает непрерывно, пока вы позволяете ему работать.

Как вы их различаете? Иногда это сложно, поскольку они работают одинаково. Когда создается новый скрипт, он выглядит следующим образом:

Вы можете видеть, что у него есть только функция OnStart и написано: Script program start function.

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

Стоимость пункта (деньги за пункт) не одинакова для всех валют. Пункт в паре AUDUSD не имеет такой же стоимости, как в паре GBPJPY.

Вы ищете конкретные символы для этого советника или, независимо от символа, просто закрыть все ордера, когда прибыль на счете достигнута?

Кроме того, стоп-лосс должен быть связан с капиталом счета или с ордером/парой?

Я знаю, что это звучит сложно, но это не так уж и сложно. Наши компьютеры настолько тупы, что если вы не укажете точно, что вы хотите, они потеряются.

Помогло ли это вам? Надеюсь, что помогло.

Будь здоров

Еще раз здравствуйте

Спасибо за очень четкий ответ... и спасибо, что очень помогли. Теперь я понимаю, чему вы учили...

"Вы ищете конкретные символы для этого советника или, независимо от того, какой символ, просто закрыть все ордера, когда прибыль на счете достигнута?" = вторая половина с некоторыми условиями является требованием

"просто закрывать все ордера при достижении прибыли по счету".

Хорошо, я торгую только 2 пары одновременно. Сначала я открываю ордер на одной паре... если он идет против меня, я хеджирую его ордером на другой паре...

Я ищу советника, который делает следующие вещи:

1) Не делать НИЧЕГО, если нет ордера или есть только ОДИН ордер.

2) Он должен ЗАКРЫВАТЬСЯ по X с прибылью ТОЛЬКО в том случае, если запущено ДВА ордера, иначе переходим к пункту 1)

3) При закрытии X, он должен учитывать спред, который должен быть оплачен, и считать X как чистую прибыль [ это уже объяснялось выше, что AccountProfit() напрямую отрицает спред, который вы должны оплатить, и показывает вам чистую, а не валовую прибыль ... поправьте, если не прав ].

4) Как вы можете видеть, SL и TP не имеют значения, я их не использую, поэтому они не нужны в советнике.

Теперь, я полностью с вами относительно бесплатных вещей, плюс, хотя я не знаю кодирования, я думаю, что больше половины того, что мне нужно, уже есть в вышеупомянутом советнике. Мне просто нужно найти что-то, чтобы изменить, что он делает то, что он делает, только когда два ордера открыты... Я думаю, это должно быть связано с этим FOR циклом там... или что-то вроде этого... =D [ Ok, теперь я завидую, что вы, ребята, можете читать код, а я не могу!!! ... теперь я чувствую себя тупым чуваком из 20-го века! Ахахаха в 21-м веке все должны знать кодирование >.< ]

Я сделал быструю блок-схему моих потребностей

EA запускается ---> Ничего не делает, пока не будет 0 или 1 ордер ----> Издает "call open sound", когда срабатывает второй ордер ----> Закрывает оба ордера с X суммой чистой прибыли [после учета спреда] и издает "call close sound" ].

конечно, звуковые файлы call open и call close могут быть любыми маленькими волновыми файлами... легко доступными на самом mt4. ... Я думаю, что эти вещи могут быть достигнуты в вышеупомянутом советнике, который я разместил, изменив несколько вещей! хехехе помогите мне plz =D

Причина обращения: