이 기사는 매우 유용하며 저만의 데이터베이스를 만들기 위해 여러 번 참조할 것입니다.
아직은 조금 이르지만 일반적으로 다섯 번째 버전의 힘을 이미 느낄 수 있습니다.
알렉산더, 이 상황에서 저를 도와주세요...
예를 들어 어떤 배열을 데이터베이스에 저장해야 합니다. 스크립트를 작성했습니다.
다음과 같이 보입니다:
#property copyright "Copyright 2010, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" #include <Object.mqh> #include <Arrays\List.mqh> // OleDb 구성 요소 연결 #include <Ado\Providers\OleDb.mqh> #include <Ado\Data.mqh> double PriceBuffer[]; //+------------------------------------------------------------------+ //| 스크립트 프로그램 시작 기능| //+------------------------------------------------------------------+ void OnStart() { long n1=100; MqlRates rates[]; ArraySetAsSeries(rates,true); double nClose[]; ArrayResize(nClose,n1); ArrayResize(t,n1); CSymbolInfo m_smbinf; m_smbinf.Name(Symbol()); int dg=m_smbinf.Digits(); int copied=CopyRates(Symbol(),0,0,n1,rates); for(int i=0;i<n1;i++) nClose[i]=rates[i].close; // SaveDataToDb에 전달할 테이블을 형성합니다. CAdoTable *table=new CAdoTable(); table.Columns().AddColumn("Price",ADOTYPE_DOUBLE); ArrayResize(PriceBuffer,n1); // 버퍼의 데이터로 데이블을 채웁니다. for(int i=1; i<n1; i++) { CAdoRecord *row=table.CreateRecord(); row.Values().GetValue(0).SetValue(PriceBuffer[i]); table.Records().Add(row); } }
하지만 컴파일 시 다음과 같은 오류가 발생합니다: "'Values' - 보호된 멤버 함수를 호출할 수 없습니다.".
이 오류는 줄과 관련이 있습니다:
row.Values().GetValue(0).SetValue(PriceBuffer[i]);
CBsvEngine::SaveData(void) 함수에서 다음과 같은 줄이 있습니다.
함수에서는 정상적으로 작동했습니다:
// 버퍼의 데이터로 데이블을 채웁니다. for(int i=1; i<TicksInBuffer; i++) { CAdoRecord *row=table.CreateRecord(); row.Values().GetValue(0).SetValue(TickBuffer[i].time); row.Values().GetValue(1).SetValue(TickBuffer[i].bid); row.Values().GetValue(2).SetValue(VolumeBuffer[i]); table.Records().Add(row); }
훌륭한 글입니다! 정말 제가 찾던 해결책이었습니다. 불행히도 저는이 기사의 러시아어 버전에서 Denkir가 언급 한 것과 동일한 문제가 있습니다.
오류가 발생하여 컴파일되지 않습니다 :
'Values'-보호 된 멤버 함수를 호출 할 수 없습니다.
CBsvEngine ::SaveData (void) 에서이 줄과 연관되어 있습니다.
나는 이것을 정말로 작동시키고 싶습니다. 정말 감사하겠습니다!
오류가 발생하여 컴파일되지 않습니다 :
'Values'-보호 된 멤버 함수를 호출 할 수 없습니다.
CBsvEngine ::SaveData (void) 에서이 줄과 연관되어 있습니다.
row.Values().GetValue(0).SetValue(TickBuffer[i].time); row.Values().GetValue(1).SetValue(TickBuffer[i].bid); row.Values().GetValue(2).SetValue(VolumeBuffer[i]);또한 DbDataAdapter.mqh 파일의 CDbDataAdapter::Fill(CAdoTable *table )에서 'Values()'에 대한 수많은 호출과 관련된 동일한 오류
나는 이것을 정말로 작동시키고 싶습니다. 정말 감사하겠습니다!
Automated-Trading:
안타깝게도 586 빌드에는 32비트 DLL 함수 호출에 오류가 있습니다. 이 문제는 다음 빌드에서 수정될 예정입니다.
안타깝게도 이 문제는 지난 업데이트 이후에도 해결되지 않았습니다. 해결책이나 권장 사항이 있나요? 얼마나 걸릴 수 있나요? 다음 빌드가 나올 때까지 기다리라고 했는데 문제가 해결되지 않은 채로 나왔습니다.
안타깝게도 586 빌드에는 32비트 DLL 함수 호출에 오류가 있습니다. 이 문제는 다음 빌드에서 수정될 예정입니다.
새로운 기고글 시장 분석을 위한 데이터베이스의 실용적 활용 가 게재되었습니다:
데이터를 다루는 것이야말로 스탠드얼론이나 네트워크 앱을 가리지 않고, 오늘날 개발되는 소프트웨어들의 주 임무가 되었습니다. 이런 문제를 해결하기위해 특화된 소프트웨어가 탄생했습니다. 이들은 데이터베이스 매니지먼트 시스템(Database Management Systems, DBMS)이라고 불리며, 컴퓨터 저장 및 처리를 위해 구조화, 시스템화, 자료 정리가 가능합니다. 거래와 관련해서는 대부분의 분석가들이 업무에서 데이터베이스를 사용하지 않습니다. 그러나 이러한 솔루션을 쓰는 편이 편리한 작업도 있습니다. 이 문서에서는 클라이언트-서버 및 파일-서버 아키텍처 모두에서 데이터베이스에서 데이터를 저장하고 로드할 수 있는 인디케이터의 일례를 보여드리겠습니다.
제 생각에는 몹시 간결하네요. 인디케이터 내에서는 클래스의 함수 중 단 둘 만 호출됩니다: ProcessTick() and SaveData(). ProcessTick() 함수는 계산에 사용되며, 데이터를 저장하지 않긴하지만 tics로 버퍼를 재설정하려면 SaveData() 함수가 필요합니다.
컴파일 해보고, "voila" - 인디케이터가 값을 보여주기 시작합니다:
1번 그림. 데이터베이스로의 링크가 없는 BuySellVolume 인디케이터의 GBPUSD M1 처리
완벽하네요! 틱은 제대로 카운트 되고 인디케이터는 계산이 굴러갑니다. 이 솔루션의 장점은 - 인디케이터 자체 (ex5) 만 필요하지 그 외엔 딱히 필요 없다는 점입니다. 하지만 만약 타임프레임, 기구를 바꾸거나 터미널을 닫으면 데이터는 비가역적으로 소실됩니다. 이를 피하기 위해 인디케이터에서 데이터를 저장하고 불러오는지 알아보겠습니다.
작성자: Alexander