2016年10月18日火曜日

.netでローソク足と出来高表示

.netでローソク足と出来高を表示する
コンパイルは
csc ChartTest2.cs /r:System.Windows.Forms.DataVisualization.dll

using System.Runtime.InteropServices;
using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

public class ChartTest:Form
{
  private Chart chart;

  public ChartTest()
  {
    this.SuspendLayout();

    Size = new Size(500,500);
    SetChart();
 
    this.ResumeLayout();
  }

  //チャート画面の作成
  private void SetChart()
  {
    //チャート画面の作成
    chart = new Chart();
    //1つ目のチャートエリア
    chart.ChartAreas.Add(new ChartArea("chart1"));
    chart.ChartAreas["chart1"].AxisX.Interval = 5;

    //2つ目のチャートエリア
    chart.ChartAreas.Add(new ChartArea("chart2"));
    //チャートエリアサイズ
    chart.Size = new Size(400,400);
 
    Controls.Add(chart);

    //チャート1の描画
    chart.Series.Add(new Series());
    Series series;
    series = chart.Series[0];
    series.ChartArea = "chart1";
    series.ChartType = SeriesChartType.Candlestick;

    //データの作成(ローソク足)
    int ii;
    for(ii = 1; ii < 10 ; ii++)
      {
        double[] d = new double[4];
        d[0] = ii * 10;  // 高値
        d[1] = ii *  3;     // 安値
        d[2] = ii *  5;     // 始値
        d[3] = ii *  8;  // 終値
        DataPoint dp = new DataPoint(ii,d);
        series.Points.Add(dp);
      }
    
    //チャート2の描画(出来高)

    chart.Series.Add(new Series());
    Series series2;
    series2 = chart.Series[1];
    series2.ChartArea = "chart2";
    series2.ChartType = SeriesChartType.StackedColumn;

    //データの作成(出来高)

    for(ii = 1; ii < 10 ; ii++)
      {
        DataPoint dp = new DataPoint(ii,ii*10000);
        series2.Points.Add(dp);
      }

  }

  public static int Main(string[] args)
  {
    ChartTest ct = new ChartTest();
    ct.ShowDialog();
    return 0;
  }

}
結果はこんな感じ。
ただ、このままだと、上と下でY軸の線が合わずにみづらいので、
chart.ChartAreas["chart1"].AlignWithChartArea = "chart2";
を追加して、軸合わせする。
(上下の軸合わせしたいだけなのに、探すのに手間取った。
 Chartクラスは、凄い便利だと思うけど、使い方に癖があって
 慣れないと使いづらい。)
で、直した版はこんな感じ。


using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

public class ChartTest:Form
{
  private Chart chart;

  public ChartTest()
  {
    this.SuspendLayout();

    Size = new Size(500,500);
    SetChart();
 
    this.ResumeLayout();
  }

  //チャート画面の作成
  private void SetChart()
  {
    //チャート画面の作成
    chart = new Chart();
    //1つ目のチャートエリア
    chart.ChartAreas.Add(new ChartArea("chart1"));
    chart.ChartAreas["chart1"].AxisX.Interval = 5;

    //2つ目のチャートエリア
    chart.ChartAreas.Add(new ChartArea("chart2"));
    //チャートエリアサイズ
    chart.Size = new Size(400,400);
 
    Controls.Add(chart);

    //チャート1の描画
    chart.Series.Add(new Series());
    Series series;
    series = chart.Series[0];
    series.ChartArea = "chart1";
    series.ChartType = SeriesChartType.Candlestick;

    //データの作成(ローソク足)
    int ii;
    for(ii = 1; ii < 10 ; ii++)
      {
        double[] d = new double[4];
        d[0] = ii * 10;  // 高値
        d[1] = ii *  3;     // 安値
        d[2] = ii *  5;     // 始値
        d[3] = ii *  8;  // 終値
        DataPoint dp = new DataPoint(ii,d);
        series.Points.Add(dp);
      }
    
    //チャート2の描画(出来高)

    chart.Series.Add(new Series());
    Series series2;
    series2 = chart.Series[1];
    series2.ChartArea = "chart2";
    series2.ChartType = SeriesChartType.StackedColumn;

    //データの作成

    for(ii = 1; ii < 10 ; ii++)
      {
        DataPoint dp = new DataPoint(ii,ii*10000);
        series2.Points.Add(dp);
      }

    /**** 上のチャートと下のチャートのY軸位置調整 ******/
    chart.ChartAreas["chart1"].AlignWithChartArea = "chart2";
    /***************************************************/
  }

  public static int Main(string[] args)
  {
    ChartTest ct = new ChartTest();
    ct.ShowDialog();
    return 0;
  }

}
実行結果は、↓
軸があって見易くなった。

2016年9月19日月曜日

C#から、dllの読み込み

C#から、Windows APIなどの、Dllを読み込む時は、読み込みの宣言をしてから使用する。
using System.Runtime.InteropServices;

public class DllRead
{
  //読込む、dllの定義
  [DllImport("Kernel32.Dll", EntryPoint="GetPrivateProfileInt")]
  public static extern uint GetPrivateProfileInt(string lpAppName,string lpKeyName,
                                                 int nDefault,string lpFileName);
  public static void Main()
  {
    uint hoge;
    //iniファイルの読込
    hoge = GetPrivateProfileInt("app","key",10,@".\file.ini");
    System.Console.WriteLine(hoge);
  }
  
}
設定ファイル:file.ini
[app]
key=66

2016年7月16日土曜日

postgresqlで月曜日の最新の日付を取得する。

下の表があるとき、月曜の中で最新の日付を取得する。

date
2016-07-11(月)
2016-07-12(火)
2016-07-13(水)
2016-07-14(木)
2016-07-15(金)


SELECT Max(date)
FROM   dateTable
WHERE extract(dow from date) = 1;
-- 日曜日(0)から土曜日(6)までの曜日


結果
    max
------------
 2016-07-11

2016年6月25日土曜日

WindowsでTCP・IP通信のひな型

サーバー側
#include
#include
int main(){
  SOCKET soc,accpSoc;
  int ret,w_ret,len;
  struct sockaddr_in addr,accpAddr;
  WORD wVersionRequested;
  WSADATA wsaData;
  char buf[256];
  wVersionRequested = MAKEWORD( 2, 2 );

  //0.Setup
  ret = WSAStartup( wVersionRequested, &wsaData );
  if ( ret != 0 ) {
    /* Tell the user that we could not find a usable */
    /* WinSock DLL.                                  */
 printf("fail startup");
    return -1;
  }
 
  //1.ソケット作成
  soc = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

  //2.bind
  addr.sin_family = AF_INET;
  addr.sin_addr.s_addr = inet_addr("0.0.0.0");
  addr.sin_port = htons(5150);
  ret = bind( soc,(SOCKADDR*) &addr, sizeof(addr) );

  if(ret == 0){
 printf("success bind\n");
  }
  else{
 w_ret = WSAGetLastError();
 printf("fail bind error code(%d)\n",w_ret);
 return w_ret;
  }
  
  //3.listen
  ret = listen(soc,1);

  if(ret == 0){
 printf("success listen\n");
  }
  else{
 w_ret = WSAGetLastError();
 printf("fail listen error code(%d)\n",w_ret);
 return w_ret;
  }

  //4.accept
  accpSoc = accept(soc,NULL,NULL);
  printf("accept socket");
  
  //5.receive
  while(1){
 len = recv(accpSoc,buf,sizeof(buf),0);
 w_ret = WSAGetLastError();
 if(len <= 0){

   break;
 }
 printf("recv message length = %d\n",len);
  }
  
  //6.後始末

  if ( LOBYTE( wsaData.wVersion ) != 2 ||
    HIBYTE( wsaData.wVersion ) != 2 ) {
    /* Tell the user that we could not find a usable */
    /* WinSock DLL.                                  */
    WSACleanup( );
    return 0; 
  }
  else{
 return -1;
  }
 
}

クライアント側
#include
#include
int main(){

  SOCKET soc;
  int ret,w_ret;
  struct sockaddr_in addr;
  WORD wVersionRequested;
  WSADATA wsaData;
  char* message = "hoge";
  //0.準備
  ret = WSAStartup( wVersionRequested, &wsaData );
  if ( ret != 0 ) {
    /* Tell the user that we could not find a usable */
    /* WinSock DLL.                                  */
 printf("fail startup");
    return -1;
  }
  
  //1.ソケット作成
  soc = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

  //2.接続
  addr.sin_family = AF_INET;
  addr.sin_addr.s_addr = inet_addr("127.0.0.1");
  addr.sin_port = htons(5150);

  if ( connect( soc, (SOCKADDR*) &addr, sizeof(addr) ) == SOCKET_ERROR) {
    printf( "Failed to connect.\n" );
    WSACleanup();
    return -1;
  }


  //3.送信
  while(1){
 send(soc,message,sizeof(message),0);
 Sleep(1000);
  }
  //4.後始末
  WSACleanup();  
  return 0;
}

2016年6月11日土曜日

.net シリアライズ機能を使用してクラスの保存

シリアライズ機能を使用する時のひな型

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

//クラス保存出来るように、属性を追加
[Serializable()]
public class Hoge
{
  public DateTime d;
}

public class SaveLoad
{
  public const string FILE_NAME = "hoge.txt";

  public static void InitFile()
  {
 if(!File.Exists(FILE_NAME))
    {
   Hoge[] h = new Hoge[1];
   h[0] = new Hoge();
   h[0].d = DateTime.Now;
   Save(h);
    }
 
  }
  
  public static void Save(Hoge[] h)
  {
 FileStream fs = new FileStream(FILE_NAME,FileMode.Create,FileAccess.Write);
 BinaryFormatter b = new BinaryFormatter();
 b.Serialize(fs,h);
 fs.Close();

  }

  public static Hoge[] Load()
  {

 BinaryFormatter b = new BinaryFormatter();
 FileStream fs = new FileStream(FILE_NAME, FileMode.OpenOrCreate, FileAccess.Read);
 Hoge[] loadFile;
 loadFile = (Hoge[])b.Deserialize(fs);
 fs.Close();

 return loadFile;  
  }

  public static void Main()
  {
 Hoge[] h;
 //ファイルがない場合は、ファイルを作成
 SaveLoad.InitFile();
 //ファイルのロード
 h = SaveLoad.Load();
 System.Console.WriteLine("前回起動時刻は"+ h[0].d.ToString("yyyy/MM/dd HH:mm:ss")+"です。");
 //終了時刻をセーブ
 h[0].d = DateTime.Now;
 SaveLoad.Save(h);
  }

2016年5月1日日曜日

postgresql で 列にコメントを表示する

1.表を作成する
  CREATE TABLE hoge (hoge int);

2.列にコメントをつける
  COMMENT ON COLUMN hoge.hoge IS 'ほげ';
 
3.列のコメントを表示する
  \d+ hoge

                   テーブル "public.hoge"
  列  |   型    | 修飾語 | ストレージ | 対象統計情報 | 説明
------+---------+--------+------------+--------------+------
 hoge | integer |        | plain      |              | ほげ


2016年4月10日日曜日

postgresql で 3番目に大きい数を取得する

select num
from  hoge
order by num desc  -- numを降順に並べる
limit 1                    -- 条件に合うnumを一つだけ取得する
offset 3;                 -- 条件に合うnumを3番目から取得する