Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2395

 
Galim_V #:
День добрый! Подскажите формулу расчета маржи  XAUUSD для форекс.

То, что нашел рисует, но с небольшой погрешностью у горцев.

//+------------------------------------------------------------------+
//|                                                   До_Аута(4).mq4 |
//|                        Copyright 2023, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property script_show_inputs
input double lot_inp=0.01; //объем
MqlTick tik;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {

   string name_id=" ",base=" ",quote=" ",currency= " ",sym=" ";
   int    leverage=0;
   double bid=0.0,
          ask=0.0,
          size_contract=0.0,
          res=0.0;
   name_id=ChartSymbol(0); //Возвращает имя символа текущего графика.
   base=SymbolInfoString(name_id,SYMBOL_CURRENCY_BASE);    //Базовая ваюта инструмента
   quote=SymbolInfoString(name_id,SYMBOL_CURRENCY_PROFIT); //Валюта прибыли
   currency= AccountCurrency();  // валюта депозита
   leverage=AccountLeverage();   // плечо текущего счета
   size_contract=SymbolInfoDouble(name_id,SYMBOL_TRADE_CONTRACT_SIZE);//Размер торгового контракта
//---Определим размер маржи для обратной котировки---------
    if(base!=currency&&quote==currency)  //Если валюта прибыли,-валюта депозита
    {
    sym=base+currency;
    Print(sym);
    if(SymbolInfoTick(sym,tik))
    bid=tik.bid;
    res=(size_contract*lot_inp)/leverage*bid;
    }
//---Подсчитаем маржу для прямой котировки-----------------
    if(base==currency&&quote!=currency)//Если валюта депозита,- базовая для инструмента
    {
    res=(size_contract*lot_inp)/leverage;
    }
//---Рассчитаем маржу для «кросс-курса»---------------------
    if(base!=currency&&quote!=currency)//Если в символе инструмента нет базовой валюты депозита
    {
    if(SymbolInfoTick(base+currency,tik))
    bid=tik.bid;
    res=(size_contract*lot_inp)/leverage*bid;
    } 
//---Рассчитаем маржу для «XAUUSD»
    if(name_id=="XAUUSD")
    {
    if(SymbolInfoTick(name_id,tik))
    bid=tik.bid;
    res=(lot_inp*bid/leverage*100);
    }
    Print("res = ",res);                    
  }
//+------------------------------------------------------------------+
 

помогите  считать  эти таблицы с csv.

 

2016-09-30,-0.65,-0.29  
2016-11-18,-0.96,-0.58  
2017-02-07,-1.91,-0.68  
2017-02-21,-1.91,-0.68  
2017-02-27,-2.91,-0.68  
2017-02-28,-2.91,-0.68  

2017-03-06,-5.1,-0.68

 

вот так выдаёт ошибку WRONG PARAMETR DATATIME

 

struct prices 
  { 
   datetime          opentime; // дата 
   double            Bid;  // цена бид 
   double            Ask;  // цена аск 
  }; 

prices arrs[]; 

 

 

 void OnTick()
   {

int h=FileOpen(name,FILE_READ|FILE_ANSI|FILE_COMMON); 
   if(h!=INVALID_HANDLE) 
     { 
      //--- прочитаем все данные из файла в массив 
      FileReadArray(file_handle,arrs); 
      //--- получим размер массива 
      int size=ArraySize(arrs); 
      //--- распечатаем данные из массива 
      for(int i=0;i<size;i++) 
         Print("Date = ",arrs[i].opentime," Bid = ",arrs[i].Bid," Ask = ",arrs[i].Ask ); 
      Print("Total data = ",size); 
      //--- закрываем файл 
      FileClose(file_handle); 
     } 
   else 
      Print("File open failed, error ",GetLastError());

кто может подсказать где ошибка

 

Изменено  только что  пользователем rahu
 

Всем добрый день.

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

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

Хочу задать интервал времени, в которое он будет проверять изменения свопа. Время изменения свопа на Альпари 10:57, по времени сервера. Хочу перепроверять ежедневно изменения за один час пять минут и до и после времени предыдущего дня. Если изменится, то изменить в настройках автоматически.

Как правильно написать? 

Гуглил не нашел и учебник читал.

        SwapBuy = (MarketInfo(Symbol(),MODE_SWAPLONG));
        SwapSell = (MarketInfo(Symbol(),MODE_SWAPSHORT));
      
      if  (OldSwapBuy != SwapBuy && SwapBuy != 0)
      {
      ChengSwap = TimeToStr(TimeCurrent(),TIME_MINUTES);
      OldSwapBuy = SwapBuy;
      }
      
      
      if (OldSwapSell != SwapSell && OldSwapSell != 0)
      {
         ChengSwap = TimeToStr(TimeCurrent(),TIME_MINUTES);
         OldSwapSell = SwapSell;
      }
 
Borys Ivanov #:

помогите  считать  эти таблицы с csv.

 

2016-09-30,-0.65,-0.29  
2016-11-18,-0.96,-0.58  
2017-02-07,-1.91,-0.68  
2017-02-21,-1.91,-0.68  
2017-02-27,-2.91,-0.68  
2017-02-28,-2.91,-0.68  

2017-03-06,-5.1,-0.68

 

вот так выдаёт ошибку WRONG PARAMETR DATATIME

 

struct prices 
  { 
   datetime          opentime; // дата 
   double            Bid;  // цена бид 
   double            Ask;  // цена аск 
  }; 

prices arrs[]; 

 

 

 void OnTick()
   {

int h=FileOpen(name,FILE_READ|FILE_ANSI|FILE_COMMON); 
   if(h!=INVALID_HANDLE) 
     { 
      //--- прочитаем все данные из файла в массив 
      FileReadArray(file_handle,arrs); 
      //--- получим размер массива 
      int size=ArraySize(arrs); 
      //--- распечатаем данные из массива 
      for(int i=0;i<size;i++) 
         Print("Date = ",arrs[i].opentime," Bid = ",arrs[i].Bid," Ask = ",arrs[i].Ask ); 
      Print("Total data = ",size); 
      //--- закрываем файл 
      FileClose(file_handle); 
     } 
   else 
      Print("File open failed, error ",GetLastError());

кто может подсказать где ошибка

 

Изменено  только что  пользователем rahu

Конечно будет ошибка т.к. формат datetime не такой.


Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип datetime
Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип datetime
  • www.mql5.com
Тип datetime предназначен для хранения даты и времени в виде количества секунд, прошедших с 01 января 1970 года. Занимает в памяти 8 байт...
 
Alexander Sevastyanov #:

Конечно будет ошибка т.к. формат datetime не такой.

ну так тоже ошибка

2016.09.30 -0.65 -0.29
2016.11.18 -0.96 -0.58
2017.02.07 -1.91 -0.68
2017.02.21 -1.91 -0.68
2017.02.27 -2.91 -0.68
2017.02.28 -2.91 -0.68
2017.03.06 -5.1 -0.68
2017.03.13 -5.1 -0.68



2024.04.24 19:12:34.540 Core 1 2023.01.03 03:01:53   Date = 1970.01.01 00:00:00 Bid = 0.0 Ask = 0.0


2016.09.30 00:00 -0.65 -0.29
2016.11.18 00:00 -0.96 -0.58
2017.02.07 00:00 -1.91 -0.68
2017.02.21 00:00 -1.91 -0.68
2017.02.27 00:00 -2.91 -0.68
2017.02.28 00:00 -2.91 -0.68
2017.03.06 00:00 -5.1 -0.68
2017.03.13 00:00 -5.1 -0.68

2024.04.24 19:16:02.598 Core 1 2023.01.03 03:58:46   Date = 1970.01.01 00:00:00 Bid = 0.0 Ask = 0.0

struct prices 
  { 
   datetime          opentime; // дата 
   double            Bid;  // цена бид 
   double            Ask;  // цена аск 
  }; 

prices arrs[]; 

 

 

 void OnTick()
   {

int h=FileOpen(name,FILE_READ|FILE_ANSI|FILE_COMMON); 
   if(h!=INVALID_HANDLE) 
     { 
      //--- прочитаем все данные из файла в массив 
      FileReadArray(file_handle,arrs); 
      //--- получим размер массива 
      int size=ArraySize(arrs); 
      //--- распечатаем данные из массива 
      for(int i=0;i<size;i++) 
         Print("Date = ",arrs[i].opentime," Bid = ",arrs[i].Bid," Ask = ",arrs[i].Ask ); 
      Print("Total data = ",size); 
      //--- закрываем файл 
      FileClose(file_handle); 
     } 
   else 
      Print("File open failed, error ",GetLastError());


 
Borys Ivanov #:

ну так тоже ошибка

2016.09.30 -0.65 -0.29
2016.11.18 -0.96 -0.58
2017.02.07 -1.91 -0.68
2017.02.21 -1.91 -0.68
2017.02.27 -2.91 -0.68
2017.02.28 -2.91 -0.68
2017.03.06 -5.1 -0.68
2017.03.13 -5.1 -0.68



2024.04.24 19:12:34.540 Core 1 2023.01.03 03:01:53   Date = 1970.01.01 00:00:00 Bid = 0.0 Ask = 0.0


2016.09.30 00:00 -0.65 -0.29
2016.11.18 00:00 -0.96 -0.58
2017.02.07 00:00 -1.91 -0.68
2017.02.21 00:00 -1.91 -0.68
2017.02.27 00:00 -2.91 -0.68
2017.02.28 00:00 -2.91 -0.68
2017.03.06 00:00 -5.1 -0.68
2017.03.13 00:00 -5.1 -0.68

2024.04.24 19:16:02.598 Core 1 2023.01.03 03:58:46   Date = 1970.01.01 00:00:00 Bid = 0.0 Ask = 0.0

struct prices 
  { 
   datetime          opentime; // дата 
   double            Bid;  // цена бид 
   double            Ask;  // цена аск 
  }; 

prices arrs[]; 

 

 

 void OnTick()
   {

int h=FileOpen(name,FILE_READ|FILE_ANSI|FILE_COMMON); 
   if(h!=INVALID_HANDLE) 
     { 
      //--- прочитаем все данные из файла в массив 
      FileReadArray(file_handle,arrs); 
      //--- получим размер массива 
      int size=ArraySize(arrs); 
      //--- распечатаем данные из массива 
      for(int i=0;i<size;i++) 
         Print("Date = ",arrs[i].opentime," Bid = ",arrs[i].Bid," Ask = ",arrs[i].Ask ); 
      Print("Total data = ",size); 
      //--- закрываем файл 
      FileClose(file_handle); 
     } 
   else 
      Print("File open failed, error ",GetLastError());


Смотрите разделители в csv файле.

 
Maksim Burov #:
TimeCurrent()
//+------------------------------------------------------------------+
//|                                                      форум06.mq4 |
//|                        Copyright 2023, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property script_show_inputs
input string tim_open="10:55";
input datetime open=D'1970.01.01 23:55:00';
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
    datetime dtime=StrToTime(tim_open)%(3600*24),
             dtm=open%(3600*24);
    Print("dtime = ",dtime," dtm = ",dtm," TimeCurrent()%(3600*24) = ",TimeCurrent()%(3600*24));
  }
//+------------------------------------------------------------------+
 
Почему оптимизация по методу "Максимум комплексного критерия" спешит подогнать все сеты под 100 сделок?

Это неудоно для оптимизации за 2 года и больше. В результате сортировка забита сетами с 1 сделкой в месяц, если не меньше
 

Добрый день!

Помогите, пожалуйста, разобраться с таким моментом - имеется написанный советник, ядром которого является открытие ордеров на пробой фрактала:

 static double Upf,Lowf;
   double Tupf=0,Tlowf=0;
   int i,k;
   for(i=2; i<5000; i++)
     {
      Tupf=iFractals(Symbol(),0,MODE_UPPER,i);
      if(Tupf>0)
         break;
     }
   for(k=2; k<5000; k++)
     {
      Tlowf=iFractals(Symbol(),0,MODE_LOWER,k);
      if(Tlowf>0)
         break;
     }
           
//----Open position
//if(i>0) Print("i = ", i, " k = ",k);
   int total=OrdersTotal();
/*if(total<1)
      {*/
      
 
   if(Ask>Tupf+10*_Point && Tupf!=Upf&&Tupf>fast_ma_0&&fast_ma_0>slow_ma_0)
     {
      double StL=NormalizeDouble(Tlowf,_Digits);
            
      int ticket=OrderSend(NULL,OP_BUY,Cclots,Ask,Slippage,StL0,Bid+Tprof*_Point,NULL,Magik,0,clrBlue);
      if(ticket<0)
        {
         Print("OrderSend error #",GetLastError());
        }
      else {Print("Ask=",Ask,"Upf=",Upf," StL=",StL); Upf=Tupf;}
     }

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

Заранее благодарю за советы по решению этой проблемы!

Файлы:
 
Alex8888888888 #:

Добрый день!

Помогите, пожалуйста, разобраться с таким моментом - имеется написанный советник, ядром которого является открытие ордеров на пробой фрактала:

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

Заранее благодарю за советы по решению этой проблемы!

множество открытий это беда не робота, это беда можно сказать разработчиков, роботом то конечно можно нагородить

можно найти в поиске "мой" способ, он наверное самый правильный будет, 

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