ロボットの作成 - ページ 2

 
Renat Akhtyamov:
コードベースをチェックしてみてください、たくさんのエキスパートがいます。1つでも徹底的に調べれば、わかるはずです。あなたのタスクが30分以内にプログラムできること

タスクに応じて...テンプレートはありますが、とても原始的です :(

 
VVT:

タスクに応じて...テンプレートはありますが、とても原始的です :(

そして、ポタポタを消化しない😂。
 
VVT:

タスクに応じて...テンプレートはありますが、とても原始的です :(

ひとつ言えるのは、原始的なプログラムであればあるほど、失敗のリスクは少ないということです。メカと同じで、細部が少ないほど信頼できる仕組みになっているのです。つまり、機能性と信頼性のバランスが大きなポイントになるわけです。

 
Роман Жилин:

ひとつ言えるのは、原始的なプログラムであればあるほど、失敗のリスクは低くなるということです。メカと同じで、部品が少なければ少ないほど信頼性の高い機構になります。つまり、機能性と信頼性のバランスが大きなポイントになるわけです。

エキスパートアドバイザーは、問題を解決するために必要な最も重要なものだけが含まれているべきで、それ以外は単なる飾りであり、コンピュータのリソースを消費しているに過ぎないということですね。

 

ボタンから開くスナップショットをご紹介します。

//+------------------------------------------------------------------+
//|                                                         0001.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#define    InpMagic  182979245
//---
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
//---
CPositionInfo  m_position; // trade position object
CTrade         m_trade;    // trading object
CSymbolInfo    m_symbol;   // symbol info object
//---
input double InpLots          =0.01; // Lots
//---
double m_adjusted_point;   // point value adjusted for 3 or 5 points
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(!m_symbol.Name(Symbol())) // sets symbol name
      return(INIT_FAILED);;
//---
   m_trade.SetExpertMagicNumber(InpMagic);
   m_trade.SetMarginMode();
   m_trade.SetTypeFillingBySymbol(m_symbol.Name());
//--- tuning for 3 or 5 digits
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;
   m_adjusted_point=m_symbol.Point()*digits_adjust;
//---
   m_trade.SetDeviationInPoints(3*digits_adjust);
   if(!m_position.Select(Symbol()))
     {
      CheckObject();
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   if(ObjectFind(0,"BUY")==0)
     {
      ObjectDelete(0,"BUY");
     }
   if(ObjectFind(0,"SELL")==0)
     {
      ObjectDelete(0,"SELL");
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   CheckButon();
  }
//+------------------------------------------------------------------+
//| Check for long position closing                                  |
//+------------------------------------------------------------------+
bool CheckButon(void)
  {
//---
   bool res=false;
     {
      if(ObjectGetInteger(0,"BUY",OBJPROP_STATE)!=0)
        {
         ObjectSetInteger(0,"BUY",OBJPROP_STATE,0);
         double price=m_symbol.Ask();
           {
            //--- open position
            if(m_trade.PositionOpen(m_symbol.Name(),ORDER_TYPE_BUY,InpLots,price,0.0,0.0))
               printf("Position by %s to be opened",m_symbol.Name());
            else
              {
               printf("Error opening BUY position by %s : '%s'",m_symbol.Name(),m_trade.ResultComment());
               printf("Open parameters : price=%f,TP=%f",price,0.0);
              }
            PlaySound("ok.wav");
           }
        }
      if(ObjectGetInteger(0,"SELL",OBJPROP_STATE)!=0)
        {
         ObjectSetInteger(0,"SELL",OBJPROP_STATE,0);
         double price0=m_symbol.Bid();
           {
            if(m_trade.PositionOpen(m_symbol.Name(),ORDER_TYPE_SELL,InpLots,price0,0.0,0.0))
               printf("Position by %s to be opened",m_symbol.Name());
            else
              {
               printf("Error opening SELL position by %s : '%s'",m_symbol.Name(),m_trade.ResultComment());
               printf("Open parameters : price=%f,TP=%f",price0,0.0);
              }
            PlaySound("ok.wav");
           }
        }
      res=true;
     }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| Check for long position closing                                  |
//+------------------------------------------------------------------+
bool CheckObject(void)
  {
//---
   bool res=false;
     {
      ObjectCreate(0,"BUY",OBJ_BUTTON,0,0,0);
      ObjectSetInteger(0,"BUY",OBJPROP_XDISTANCE,ChartGetInteger(0,CHART_WIDTH_IN_PIXELS)-102);
      ObjectSetInteger(0,"BUY",OBJPROP_YDISTANCE,37);
      ObjectSetString(0,"BUY",OBJPROP_TEXT,"BUY");
      ObjectSetInteger(0,"BUY",OBJPROP_BGCOLOR,clrMediumSeaGreen);
      ObjectCreate(0,"SELL",OBJ_BUTTON,0,0,0);
      ObjectSetInteger(0,"SELL",OBJPROP_XDISTANCE,ChartGetInteger(0,CHART_WIDTH_IN_PIXELS)-50);
      ObjectSetInteger(0,"SELL",OBJPROP_YDISTANCE,37);
      ObjectSetString(0,"SELL",OBJPROP_TEXT,"SELL");
      ObjectSetInteger(0,"SELL",OBJPROP_BGCOLOR,clrDarkOrange);
      res=true;
     }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
ファイル:
0001.mq5  5 kb
 
SanAlex:

ボタンで開くために作った簡単なものを紹介します。

ありがとうございます、ひとまず調べてみようと思います。

 
Роман Жилин:

ありがとうございます、まずは勉強してみようと思います。

EAにストラテジーを合わせるのはあまりお勧めしませんが、その逆が良いでしょう。あるいは、他のEAの必要なパーツを組み合わせて、戦略を実行することもできます。

 
Роман Жилин:

初心者のための正しい方向性が必要、堂々巡りをしているような気がする


Guide-Forum-Stories-Compiler-Errors(以下、毎回輪番で)。

新しいことを学ぶと思うのですが、EAを起動するときに基本的な注文すら開けず、ひどく落ち込んでいる感じがしています。道なき夜の深淵に松明を照らしてくれる人が欲しい。道に迷い、今も彷徨っている。


完全にプログラム、それが開始されたときに取引を開く上で、何が何であるかを明確にしてください。たくさん助けてください。

ローマンさん、こんにちは。

初心者のための素晴らしい記事が2つあり、とても参考になりました。

https://www.mql5.com/ru/articles/481

https://www.mql5.com/ru/articles/496

敬具 ウラジミール

Торговые операции на MQL5 - это просто
Торговые операции на MQL5 - это просто
  • www.mql5.com
Почти все трейдеры приходят на рынок для того, чтобы заработать денег, хотя есть и доля тех, кому важен не сам торговый результат, а участие в процессе, драйв. Впрочем, получить удовольствие от процесса можно не только торгуя вручную, но и занимаясь разработкой автоматических торговых систем. Ведь создание торгового робота может быть таким же...
 
MrBrooklin:

ローマンさん、こんにちは。

初心者のための素晴らしい記事が2つあり、とても参考になりました。

https://www.mql5.com/ru/articles/481

https://www.mql5.com/ru/articles/496

敬具 ウラジミール

ウラジミール、ありがとうございます。最初の記事にも出会いましたが、2番目の記事はまさに今の私に必要なものです。


ローマンさん、こんにちは。

 
Роман Жилин:

ウラジミール、ありがとうございます。最初の記事は偶然見つけたのですが、2番目の記事はまさに今の私に必要なものです。


敬具 ローマン

また、MQL5 Reference(MQL5ホームページのMQL5Documentation タブ)を利用しています。ほぼすべての情報を収録しています。この本の唯一の大きな欠点は、他のプログラミング言語の基礎知識がある人向けに書かれており、初心者向けではないことです。例えば、「リターンズ」で始まる常套句の意味がいまだに理解できない。

AccountInfoDouble

対応するアカウントプロパティの double 型の値を返します


誰が戻るのか、どこに戻るのか、なぜ戻る のか。いまだに理解できない。

ウラジミールさん、ありがとうございます。

Документация по MQL5: Информация о счете / AccountInfoDouble
Документация по MQL5: Информация о счете / AccountInfoDouble
  • www.mql5.com
AccountInfoDouble - Информация о счете - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5