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

 
-Aleks-:
Я конечно понимаю, что проблема из за перерасчета на нулевом баре, но никак не могу сообразить, как её решить?

Теперь 03 глючит.

Вот это место: 

      x=Pos;
      y=Neg;
      Pos=positive;
      Neg=negative;

Данные хранить в простых переменных - это сработает только при первом расчете индикатора. Потом, на нулевом баре, в переменной, в которой должны быть данные от предыдущего бара, будут данные от текущего бара, но на предыдущем тике.

 
 

 
Dmitry Fedoseev:

Теперь 03 глючит.

Вот это место: 

      x=Pos;
      y=Neg;
      Pos=positive;
      Neg=negative;

Данные хранить в простых переменных - это сработает только при первом расчете индикатора. Потом, на нулевом баре, в переменной, в которой должны быть данные от предыдущего бара, будут данные от текущего бара, но на предыдущем тике.

 
 

Да это я понял, конечно, мне интересно, как решить задачу без графического буфера - для экономии ресурсов - памяти?
 
-Aleks-:
Да это я понял, конечно, мне интересно, как решить задачу без графического буфера - для экономии ресурсов - памяти?

Помедитируйте вот над этим индикатором. В нем куча переменных static:

   static datetime LastTime=0;
   static int cDir=0;
   static int pDir=0;

Они сделаны взамен буферов.

При IndicatorCounted()=0 LastTime надо обнулять (остальные не обязательно, но желательно). 

Потом в начале цикла перемещать значения:

if(Time[i]>LastTime)
        {
         LastTime=Time[i];
         pDir=cDir;

        }
      else
        {
         cDir=pDir;
        }

Переменные начинающиеся с "c" - текущее значение, а с "p" - предыдущее.

 
Здравствуйте. Помогите пожалуйста разобраться с кодом. Пытаюсь написать скрипт, который запишет доступную историю торговли в файл. Но видимо что-то в коде не так, потому что в результате исполнения скрипта в файле оказываются записанные только две строчки: заглавная (см. в коде) и данные самой старой сделки из истории. Не пойму в чем дело. Самостоятельно разобраться не получилось, прошу помощи.

string MyFileName="History_Of_Trades.csv";
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
//нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
//создаем файл и записываем в него заглавную строку
//нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн


  int file_handle=FileOpen(MyFileName, FILE_WRITE, " ");
  string mytext="Магик;Номер ордера;Время открытия;Время закрытия;Объем;Символ;Цена открытия;Цена закрытия;Своп;Прибыль";
  FileWrite(file_handle, mytext);
  FileClose(file_handle); 


//нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
//записываем в файл данные по закрытым позициям
//нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
  
  for (int n=1; n<=OrdersTotal(); n++) {
    if (OrderSelect(n-1,SELECT_BY_POS,MODE_HISTORY)) {
      if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          
          mytext=OrderMagicNumber()+";"
                 +OrderTicket()+";"
                 +TimeToString(OrderOpenTime(),TIME_DATE|TIME_MINUTES)+";"
                 +TimeToString(OrderCloseTime(),TIME_DATE|TIME_MINUTES)+";"
                 +DoubleToString(OrderLots(),2)+";"
                 +Symbol()+";"
                 +DoubleToString(OrderOpenPrice(),Digits)+";"
                 +DoubleToString(OrderClosePrice(),Digits)+";"
                 +DoubleToString(OrderSwap(),2)+";"
                 +DoubleToString(OrderProfit(),2);
                
       file_handle=FileOpen(MyFileName, FILE_READ|FILE_WRITE, " ");
       FileSeek(file_handle, 0, SEEK_END);
       FileWrite(file_handle, mytext);
       FileClose(file_handle);
       }}}}
 
kosmo13:
Здравствуйте. Помогите пожалуйста разобраться с кодом. Пытаюсь написать скрипт, который запишет доступную историю торговли в файл. Но видимо что-то в коде не так, потому что в результате исполнения скрипта в файле оказываются записанные только две строчки: заглавная (см. в коде) и данные самой старой сделки из истории. Не пойму в чем дело. Самостоятельно разобраться не получилось, прошу помощи.
Дмитрий хорошую статью написал.
 
Artyom Trishkin:
Дмитрий хорошую статью написал.
спасибо, интересно, почитаю. там есть скрипт как раз какой мне надо, только он все равно не работает у меня, там mql5, а у меня mql4, компилятор выдает кучу ошибок, видимо много незнакомых слов для него :(
 
kosmo13:
спасибо, интересно, почитаю. там есть скрипт как раз какой мне надо, только он все равно не работает у меня, там mql5, а у меня mql4, компилятор выдает кучу ошибок, видимо много незнакомых слов для него :(
Какой именно скрипт. Давайте поглядим.
 

Здравствуйте. Нужна отправка на api.binaryteam.ru из индикатора после алерта.  Какие строки нужно добавить в файл индикатора.mq4 , чтобы после алерта на адрес api.binaryteam.ru отправлялась строка вида  http://api.binaryteam.ru/?request=signal&amp;key=12345472300af900f431234561234567&formname=risefall&type_account=demo&symbol=frxUSDCHF&duration=5m&amount=3&bet=CALL&source=metatrader.

Есть пример отправки для советников http://binaryteam.ru/addons/#api http://binaryteam.ru/files/mt4example_1.zip через WebRequest .  При добавлении в  файл индикатора.mq4 строк 

extern  string url="http://api.binaryteam.ru/";

extern  double  bet=1;

extern int expiration=1;

extern string key = "12345472300af900f431234561234567" ;

extern string type_account = "demo";

extern bool Flag = false;

extern string bettype;

.....
int start() {

....

условие покупки {

.....

Alert("алерт индюка  -  BUY!!!");

bettype = "CALL";

      Print("направление ставки: ",bettype);

      Flag = true;

Print(BinaryTeam());

  }

условие продажи {

.....  

Alert(""алерт индюка  -   SELL!!!");

bettype = "PUT";

      Print("направление ставки: ",bettype);

      Flag = true;

Print(BinaryTeam());

  }

  }

bool BinaryTeam()

{

   char post[],result[];

   int res;

      string headers;

    //--- для работы с сервером необходимо добавить URL

   //--- в список разрешенных URL (Главное меню->Сервис->Настройки, вкладка "Советники"):

      string formname = "risefall";

   string symbol = "frx" + Symbol();

   string duration = IntegerToString(expiration) + "m";

   string amount = DoubleToString(bet);

  if(Flag==false)

   {

      Print("не задано направление торговли");

      return(false);

   }

  

   //--- пример: http://api.binaryteam.ru/?request=signal&amp;key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&formname=risefall&type_account=demo&symbol=frxUSDCHF&duration=5m&amount=3&bet=CALL&source=metatrader

  

   //--- собираем строку для отправки

   string send = "?request=signal" +

         "&source=metatrader" +

         "&type_account=" + type_account +

         "&bet=" + bettype +

         "&formname=" + formname +

"&date_start=now" +

         "&symbol=" + symbol +

         "&duration=" + duration +

         "&barrier=0" +

         "&amount=" + amount +

         "&key=" + key;

  

   Print(send);

  

   ResetLastError();



   int timeout=5000;

   res = WebRequest("GET",url+send,NULL,NULL,timeout,post,0,result,headers);

   if(res==-1)

     {

      Print("Ошибка в WebRequest. Код ошибки  =",GetLastError());

      MessageBox("Необходимо добавить адрес '"+url+"' в список разрешенных URL во вкладке 'Советники'","Ошибка",MB_ICONINFORMATION);

     }

   else

     {

      Print(CharArrayToString(result));

      return(true);

     }

   Print("Непредвиденная ситуация");

   return(false);

}
  

 пишет 2016.11.16 13:50:01.783 Ошибка в WebRequest. Код ошибки  =4060

Как передать запрос без функции WebRequest? есть ли другие функции похожие на  WebRequest? чтобы можно было добавить в файл индикатора.mq4 

 
Artyom Trishkin:
Какой именно скрипт. Давайте поглядим.

В приложении к той статье он называеся sHistoryExport.mq5. Компилятор у меня не принимает функции названия которых начинаются с "HistoryDeal.." и идентификаторы начинающиеся с "DEAL_..". Вот код:

#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#property script_show_inputs

input bool     UseDateFrom = false; // Указывать дату начала
input datetime DateFrom=0; // Дата начала
input bool     UseDateTo=false; // Указывать дату окончания
input datetime DateTo=0; // Дата окончания



//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(){

   datetime from,to;
  
   if(UseDateFrom){
      from=DateFrom;
   }
   else{
      from=0;
   }
  
   if(UseDateTo){
      to=DateTo;
   }
   else{
      to=TimeCurrent();
   }  
  
   if(!HistorySelect(from,to)){
      Alert("Ошибка выделение истории");
      return;
   }
  
   string FileName="history.csv";
  
   int h=FileOpen(FileName,FILE_WRITE|FILE_ANSI|FILE_CSV,";");
  
   if(h==INVALID_HANDLE){
      Alert("Ошибка открытия файла");
      return;
   }
  
   // первая строка, что бы знать, где что находится
  
   FileWrite(h,"Time","Deal","Order","Symbol","Type","Direction","Volume","Price","Comission","Swap","Profit","Comment");    
   // по всем сделкам

   for(int i=0;i<HistoryDealsTotal();i++){
      ulong ticket=HistoryDealGetTicket(i);
      if(ticket!=0){
        
         long type=HistoryDealGetInteger(ticket,DEAL_TYPE);
        
         if(type==DEAL_TYPE_BUY || type==DEAL_TYPE_SELL){
      
            long entry=HistoryDealGetInteger(ticket,DEAL_ENTRY);
      
            FileWrite(h,(datetime)HistoryDealGetInteger(ticket,DEAL_TIME),
                        ticket,
                        HistoryDealGetInteger(ticket,DEAL_ORDER),
                        HistoryDealGetString(ticket,DEAL_SYMBOL),
                        (type==DEAL_TYPE_BUY?"buy":"sell"),
                        (entry==DEAL_ENTRY_IN?"in":(entry==DEAL_ENTRY_OUT?"out":"in/out")),
                        DoubleToString(HistoryDealGetDouble(ticket,DEAL_VOLUME),2),
                        HistoryDealGetDouble(ticket,DEAL_PRICE),
                        DoubleToString(HistoryDealGetDouble(ticket,DEAL_COMMISSION),2),
                        DoubleToString(HistoryDealGetDouble(ticket,DEAL_SWAP),2),
                        DoubleToString(HistoryDealGetDouble(ticket,DEAL_PROFIT),2),
                        HistoryDealGetString(ticket,DEAL_COMMENT)                    
            );
         }
      }
      else{
         Alert("Ошибка выделения сделки, повторите попытку");
         FileClose(h);
         return;
      }
   }

   FileClose(h);

   Alert("Сохранение выполнено, см. файл "+FileName);  
  
}
//+------------------------------------------------------------------+
 
Как определить из советника, что пришел алерт индикатора ?
Причина обращения: