제가 시작했으니 마무리를 지어야할 거 같아서 달아드립니다. ^^
핵심은 자신이 만든 배열의 각 요소의(저장할) 값의 이름을 어떻게 지정할것인가 입니다.
그리고 체결통보 객체의 내용을 배열에 따로 저장한다고 하시는데 굳이 그렇게 할 필요가
있을까요? 그냥 체결통보 객체 자체를 매개변수로 함수에 넣으면 될텐데요.
예를 들어서 AAA 라는 전략과 BBB 라는 전략이 있고 두 전략의 체결통보시 필요한 내역을 저장하고 싶다면
function SaveNotifyFill(sName, NotifyFill)
{
Main.SetUserValue(sName + "_code", NorifyFill.code); // 종목코드
Main.SetUserValue(sName + "_fillCount", NorifyFill.fillCount); // 체결수량
Main.SetUserValue(sName + "_fillPrice", NorifyFill.fillPrice); // 체결가격
}
이렇게 함수를 만들고 각 전략에서 함수를 적절하게 호출하면 됩니다.
---- AAA
function Main_OnNotifyFill(NotifyFill)
{
SaveNotifyFill("AAA", NotifyFill);
}
---- AAA
---- BBB
function Main_OnNotifyFill(NotifyFill)
{
SaveNotifyFill("BBB", NotifyFill);
}
---- BBB
이렇게 저장된 값을 불러올 때는 값을 저장할 객체나 배열이 있어야 합니다.
그런데 객체를 만들 것이냐 배열을 만들것이냐는 개인의 취향이겠지만
저렇게 DB 식으로 얘기하면 레코드라고 불려지는 데이터들은 객체로 만들어야 합니다.
그래야 스크립트를 보면서 자기가 무슨 짓을 하는지를 알 수 있으니까요.
예를 들어서 체결통보 이벤트로 넘어오는 NotifyFill 객체의 값들이 객체가 아닌 배열이라고 생각해 보세요.
원하는 값을 참조하려면 배열의 인덱스(숫자)를 일일이 기억해야 합니다.
var a = NotifyFill[0]; 이런 식으로 코딩을 해야하는데 저 0 이 뭐고 a에 어떤 값이 입력되는지 스크립트보면 알 수 있을까요?
그나마 객체의 프로퍼티로 네이밍되어 있기 때문에 var a = NotifyFill.fillPrice;
이렇게 스크립트만 봐도 아, a 에 체결가가 들어가겠구나라고 알 수 있는거죠.
설사 처음 접해서 fillPrice가 뭔지 모른다고 하더라도 한번 해보고나면 쉽게 기억하겠죠.
따라서, 함수객체를 하나 만들어서 Main.GetUserValue() 를 이용해서 함수객체의 프로퍼티에 저장하게 합니다.
function UserNotifyFill()
{
this.code = "";
this.fillCount = 0;
this.fillPrice = 0;
}
// 이게 뭔지 모르겠으면 자바스크립트 책하나 사서 공부해야합니다.
이제 각 전략에서 원하는 시점에 값을 불러옵니다.
var userNotifyFill = new UserNotifyFill();
userNotifyFill.code = Main.GetUserValue("AAA_code");
userNotifyFill.fillCount = Main.GetUserValue("AAA_fillCount");
userNotifyFill.fillPrice = Main.GetUserValue("AAA_fillPrice");
"AAA_code" 왜 이렇게 해야하는지 이제는 굳이 설명하지 않아도 되겠죠?? ^^
참고로, 내부함수라는 말은 적합하지 않습니다. 그냥 Main 이라는 객체의 메쏘드인거죠.
물론 Main 객체는 자바스크립트의 기본적인 객체가 아니라 예스스탁에서 스팟에 내장시킨객체이긴 합니다만...
메쏘드, 프로퍼티 이런 개념들은 역시 자바스크립트 책하나 사시길 바랍니다 아무거나.
이 SetUserValue 라는 메쏘드는 살펴보니 파일로 XML형태로 저장되더군요.
Spot 디렉토리에 UserValue.yuv 라는 파일이 생기는데 이 파일을 메모장으로 열어보면
자신이 저장한 결과를 확인할 수 있습니다.
제가 자바스크립트에 좀 익숙하다보니 알면 알수록 스팟이 대단한 프로그램이라는 생각이 드네요...
여기에서 뭔가 더 확장하고 싶다면 자신의 힘으로 해 보시길 바랍니다.
그렇지 않으면... ^^
> brucehan 님이 쓴 글입니다.
> 제목 : 함수의 매개변수와 배열과 내부함수
> 질문[739번: 배열을 내부함수로 저장하고 불러오기]와 관련입니다
1. function Main_OnNotifyFill(NotifyFill) 에서
체결통보 발생할때마다 종목코드, 체결가등을 전략별로 각각 배열에 저장한후
2. 사용자정의함수에서 전략별로 체결내역이 저장되어있는 배열을 매개변수로 전달받다
손익, 델타등을 계산해 거래하고 있습니다.
3. 그런데 장중에 네트워크문제인지 하튼 무슨 문제인지 예스트레이더가 끊겨
모든 체결내역들을 내부함수(Main.SetUserValue, Main.GetUserValue)로 저장해서
사용하려 하는데
4. 질문[739] 과 같이 내부함수를 쓰기 위해 배열을 사용안한다면
사용자함수에서 그 많은 체결내역등을 배열로 전달받지 않고서는 불가능할거 같은데요
컴맹인 제 실력에서는 적절한 방법이 안나옵니다
5. 요약:
사용자함수에서 매개변수로 배열을 사용할때
배열내용등을 내부함수로 처리하여 네트워크문제로 부터 보호될 수 있는 방법을
가려쳐 주시기 바랍니다
미리 감사드립니다. 꾸벅!!!
brucehan
2013-10-18 10:22:19
자세한 답변 감사합니다
정말 많이 배우고 있습니다 꾸벅!
> 불꽃기사 님이 쓴 글입니다.
> 제목 : Re : 함수의 매개변수와 배열과 내부함수
> 제가 시작했으니 마무리를 지어야할 거 같아서 달아드립니다. ^^
핵심은 자신이 만든 배열의 각 요소의(저장할) 값의 이름을 어떻게 지정할것인가 입니다.
그리고 체결통보 객체의 내용을 배열에 따로 저장한다고 하시는데 굳이 그렇게 할 필요가
있을까요? 그냥 체결통보 객체 자체를 매개변수로 함수에 넣으면 될텐데요.
예를 들어서 AAA 라는 전략과 BBB 라는 전략이 있고 두 전략의 체결통보시 필요한 내역을 저장하고 싶다면
function SaveNotifyFill(sName, NotifyFill)
{
Main.SetUserValue(sName + "_code", NorifyFill.code); // 종목코드
Main.SetUserValue(sName + "_fillCount", NorifyFill.fillCount); // 체결수량
Main.SetUserValue(sName + "_fillPrice", NorifyFill.fillPrice); // 체결가격
}
이렇게 함수를 만들고 각 전략에서 함수를 적절하게 호출하면 됩니다.
---- AAA
function Main_OnNotifyFill(NotifyFill)
{
SaveNotifyFill("AAA", NotifyFill);
}
---- AAA
---- BBB
function Main_OnNotifyFill(NotifyFill)
{
SaveNotifyFill("BBB", NotifyFill);
}
---- BBB
이렇게 저장된 값을 불러올 때는 값을 저장할 객체나 배열이 있어야 합니다.
그런데 객체를 만들 것이냐 배열을 만들것이냐는 개인의 취향이겠지만
저렇게 DB 식으로 얘기하면 레코드라고 불려지는 데이터들은 객체로 만들어야 합니다.
그래야 스크립트를 보면서 자기가 무슨 짓을 하는지를 알 수 있으니까요.
예를 들어서 체결통보 이벤트로 넘어오는 NotifyFill 객체의 값들이 객체가 아닌 배열이라고 생각해 보세요.
원하는 값을 참조하려면 배열의 인덱스(숫자)를 일일이 기억해야 합니다.
var a = NotifyFill[0]; 이런 식으로 코딩을 해야하는데 저 0 이 뭐고 a에 어떤 값이 입력되는지 스크립트보면 알 수 있을까요?
그나마 객체의 프로퍼티로 네이밍되어 있기 때문에 var a = NotifyFill.fillPrice;
이렇게 스크립트만 봐도 아, a 에 체결가가 들어가겠구나라고 알 수 있는거죠.
설사 처음 접해서 fillPrice가 뭔지 모른다고 하더라도 한번 해보고나면 쉽게 기억하겠죠.
따라서, 함수객체를 하나 만들어서 Main.GetUserValue() 를 이용해서 함수객체의 프로퍼티에 저장하게 합니다.
function UserNotifyFill()
{
this.code = "";
this.fillCount = 0;
this.fillPrice = 0;
}
// 이게 뭔지 모르겠으면 자바스크립트 책하나 사서 공부해야합니다.
이제 각 전략에서 원하는 시점에 값을 불러옵니다.
var userNotifyFill = new UserNotifyFill();
userNotifyFill.code = Main.GetUserValue("AAA_code");
userNotifyFill.fillCount = Main.GetUserValue("AAA_fillCount");
userNotifyFill.fillPrice = Main.GetUserValue("AAA_fillPrice");
"AAA_code" 왜 이렇게 해야하는지 이제는 굳이 설명하지 않아도 되겠죠?? ^^
참고로, 내부함수라는 말은 적합하지 않습니다. 그냥 Main 이라는 객체의 메쏘드인거죠.
물론 Main 객체는 자바스크립트의 기본적인 객체가 아니라 예스스탁에서 스팟에 내장시킨객체이긴 합니다만...
메쏘드, 프로퍼티 이런 개념들은 역시 자바스크립트 책하나 사시길 바랍니다 아무거나.
이 SetUserValue 라는 메쏘드는 살펴보니 파일로 XML형태로 저장되더군요.
Spot 디렉토리에 UserValue.yuv 라는 파일이 생기는데 이 파일을 메모장으로 열어보면
자신이 저장한 결과를 확인할 수 있습니다.
제가 자바스크립트에 좀 익숙하다보니 알면 알수록 스팟이 대단한 프로그램이라는 생각이 드네요...
여기에서 뭔가 더 확장하고 싶다면 자신의 힘으로 해 보시길 바랍니다.
그렇지 않으면... ^^
> brucehan 님이 쓴 글입니다.
> 제목 : 함수의 매개변수와 배열과 내부함수
> 질문[739번: 배열을 내부함수로 저장하고 불러오기]와 관련입니다
1. function Main_OnNotifyFill(NotifyFill) 에서
체결통보 발생할때마다 종목코드, 체결가등을 전략별로 각각 배열에 저장한후
2. 사용자정의함수에서 전략별로 체결내역이 저장되어있는 배열을 매개변수로 전달받다
손익, 델타등을 계산해 거래하고 있습니다.
3. 그런데 장중에 네트워크문제인지 하튼 무슨 문제인지 예스트레이더가 끊겨
모든 체결내역들을 내부함수(Main.SetUserValue, Main.GetUserValue)로 저장해서
사용하려 하는데
4. 질문[739] 과 같이 내부함수를 쓰기 위해 배열을 사용안한다면
사용자함수에서 그 많은 체결내역등을 배열로 전달받지 않고서는 불가능할거 같은데요
컴맹인 제 실력에서는 적절한 방법이 안나옵니다
5. 요약:
사용자함수에서 매개변수로 배열을 사용할때
배열내용등을 내부함수로 처리하여 네트워크문제로 부터 보호될 수 있는 방법을
가려쳐 주시기 바랍니다
미리 감사드립니다. 꾸벅!!!
brucehan
2013-10-18 10:43:49
1. 답변해주신 아래 식에서
function SaveNotifyFill(sName, NotifyFill)
{
Main.SetUserValue(sName + "_code", NorifyFill.code); // 종목코드
Main.SetUserValue(sName + "_fillCount", NorifyFill.fillCount); // 체결수량
Main.SetUserValue(sName + "_fillPrice", NorifyFill.fillPrice); // 체결가격
}
=> 옵션합성전략인 경우 한번에 여러 종목들이 진입하는데요
체결통보 올적마다 위의 식으로 처리하려면 어떻게 하나요?
좀 간편한 방법이 있었으면 합니다.
2. 답변해 주신 아래 함수객체에서요
function UserNotifyFill()
{
this.code = "";
this.fillCount = 0;
this.fillPrice = 0;
}
------------------------------------------------------------
var userNotifyFill = new UserNotifyFill();
userNotifyFill.code = Main.GetUserValue("AAA_code");
userNotifyFill.fillCount = Main.GetUserValue("AAA_fillCount");
userNotifyFill.fillPrice = Main.GetUserValue("AAA_fillPrice");
위에서 말한 합성전략처럼 한번에 여러 종목들이 진입할때
함수객체를 써서 편하게 전략을 짤 수 있는 방법이 있었으면 합니다
함수객체가 편한 것 같긴한데
위의 경우처럼 배열성격을 갖는 여러종목들이 진입할 때에도
과연 유묭한 방법인지 잘 모르겠습니다
자세한 답변에 항상 감사하게 생각하고 있습니다 꾸벅!
> brucehan 님이 쓴 글입니다.
> 제목 : 자세한 답변 감사합니다 꾸벅!
>
자세한 답변 감사합니다
정말 많이 배우고 있습니다 꾸벅!
> 불꽃기사 님이 쓴 글입니다.
> 제목 : Re : 함수의 매개변수와 배열과 내부함수
> 제가 시작했으니 마무리를 지어야할 거 같아서 달아드립니다. ^^
핵심은 자신이 만든 배열의 각 요소의(저장할) 값의 이름을 어떻게 지정할것인가 입니다.
그리고 체결통보 객체의 내용을 배열에 따로 저장한다고 하시는데 굳이 그렇게 할 필요가
있을까요? 그냥 체결통보 객체 자체를 매개변수로 함수에 넣으면 될텐데요.
예를 들어서 AAA 라는 전략과 BBB 라는 전략이 있고 두 전략의 체결통보시 필요한 내역을 저장하고 싶다면
function SaveNotifyFill(sName, NotifyFill)
{
Main.SetUserValue(sName + "_code", NorifyFill.code); // 종목코드
Main.SetUserValue(sName + "_fillCount", NorifyFill.fillCount); // 체결수량
Main.SetUserValue(sName + "_fillPrice", NorifyFill.fillPrice); // 체결가격
}
이렇게 함수를 만들고 각 전략에서 함수를 적절하게 호출하면 됩니다.
---- AAA
function Main_OnNotifyFill(NotifyFill)
{
SaveNotifyFill("AAA", NotifyFill);
}
---- AAA
---- BBB
function Main_OnNotifyFill(NotifyFill)
{
SaveNotifyFill("BBB", NotifyFill);
}
---- BBB
이렇게 저장된 값을 불러올 때는 값을 저장할 객체나 배열이 있어야 합니다.
그런데 객체를 만들 것이냐 배열을 만들것이냐는 개인의 취향이겠지만
저렇게 DB 식으로 얘기하면 레코드라고 불려지는 데이터들은 객체로 만들어야 합니다.
그래야 스크립트를 보면서 자기가 무슨 짓을 하는지를 알 수 있으니까요.
예를 들어서 체결통보 이벤트로 넘어오는 NotifyFill 객체의 값들이 객체가 아닌 배열이라고 생각해 보세요.
원하는 값을 참조하려면 배열의 인덱스(숫자)를 일일이 기억해야 합니다.
var a = NotifyFill[0]; 이런 식으로 코딩을 해야하는데 저 0 이 뭐고 a에 어떤 값이 입력되는지 스크립트보면 알 수 있을까요?
그나마 객체의 프로퍼티로 네이밍되어 있기 때문에 var a = NotifyFill.fillPrice;
이렇게 스크립트만 봐도 아, a 에 체결가가 들어가겠구나라고 알 수 있는거죠.
설사 처음 접해서 fillPrice가 뭔지 모른다고 하더라도 한번 해보고나면 쉽게 기억하겠죠.
따라서, 함수객체를 하나 만들어서 Main.GetUserValue() 를 이용해서 함수객체의 프로퍼티에 저장하게 합니다.
function UserNotifyFill()
{
this.code = "";
this.fillCount = 0;
this.fillPrice = 0;
}
// 이게 뭔지 모르겠으면 자바스크립트 책하나 사서 공부해야합니다.
이제 각 전략에서 원하는 시점에 값을 불러옵니다.
var userNotifyFill = new UserNotifyFill();
userNotifyFill.code = Main.GetUserValue("AAA_code");
userNotifyFill.fillCount = Main.GetUserValue("AAA_fillCount");
userNotifyFill.fillPrice = Main.GetUserValue("AAA_fillPrice");
"AAA_code" 왜 이렇게 해야하는지 이제는 굳이 설명하지 않아도 되겠죠?? ^^
참고로, 내부함수라는 말은 적합하지 않습니다. 그냥 Main 이라는 객체의 메쏘드인거죠.
물론 Main 객체는 자바스크립트의 기본적인 객체가 아니라 예스스탁에서 스팟에 내장시킨객체이긴 합니다만...
메쏘드, 프로퍼티 이런 개념들은 역시 자바스크립트 책하나 사시길 바랍니다 아무거나.
이 SetUserValue 라는 메쏘드는 살펴보니 파일로 XML형태로 저장되더군요.
Spot 디렉토리에 UserValue.yuv 라는 파일이 생기는데 이 파일을 메모장으로 열어보면
자신이 저장한 결과를 확인할 수 있습니다.
제가 자바스크립트에 좀 익숙하다보니 알면 알수록 스팟이 대단한 프로그램이라는 생각이 드네요...
여기에서 뭔가 더 확장하고 싶다면 자신의 힘으로 해 보시길 바랍니다.
그렇지 않으면... ^^
> brucehan 님이 쓴 글입니다.
> 제목 : 함수의 매개변수와 배열과 내부함수
> 질문[739번: 배열을 내부함수로 저장하고 불러오기]와 관련입니다
1. function Main_OnNotifyFill(NotifyFill) 에서
체결통보 발생할때마다 종목코드, 체결가등을 전략별로 각각 배열에 저장한후
2. 사용자정의함수에서 전략별로 체결내역이 저장되어있는 배열을 매개변수로 전달받다
손익, 델타등을 계산해 거래하고 있습니다.
3. 그런데 장중에 네트워크문제인지 하튼 무슨 문제인지 예스트레이더가 끊겨
모든 체결내역들을 내부함수(Main.SetUserValue, Main.GetUserValue)로 저장해서
사용하려 하는데
4. 질문[739] 과 같이 내부함수를 쓰기 위해 배열을 사용안한다면
사용자함수에서 그 많은 체결내역등을 배열로 전달받지 않고서는 불가능할거 같은데요
컴맹인 제 실력에서는 적절한 방법이 안나옵니다
5. 요약:
사용자함수에서 매개변수로 배열을 사용할때
배열내용등을 내부함수로 처리하여 네트워크문제로 부터 보호될 수 있는 방법을
가려쳐 주시기 바랍니다
미리 감사드립니다. 꾸벅!!!
댓글은 여기까지만... 힌트만 드리도록 하겠습니다. ^^
우선 1.
여러 전략들이 사용자정의함수를 같이 쓴다고 하셔서 전략명을 키로 잡은 건데
거기에 여러 종목들을 같이 관리해야 한다면 종목코드를 키에 추가해야겠죠
var key = sName + NotifyFill.code;
Main.SetUserValue(key + "_fillCount", NorifyFill.fillCount);
전략명이 AAA고 연결선물이라면 "AAA00000000_fillCount" 라는 이름으로 체결수량이 저장되겠죠.
다음 2.
먼저 여러 전략들의 여러 종목들을 관리하기는 힘듭니다.
물론, 못 하는 건 아니지만 스크립트가 복잡해지고 관리를 위해 계속 파일을 뒤져야
하기 때문에 속도도 드리지고 나중에 파악하기도 힘들겁니다.
따라서 하나의 스팟전략에서 여러 개의 종목을 관리해가며 값을 저장하는 방법만 알려드리죠.
함수의 매개변수로 NotifyFill 객체를 입력한 것을 이제 UserNofityFill 객체의 배열로 바꿉니다.
UserNotifyFill 은 OnNotifyFill 이벤트에서 만들어서 관리합니다.
var arrayNotifyFill = new Array();
-------------------------------------
var userNotifyFill = new UserNotifyFill();
userNotifyFill.code = NotifyFill.code;
userNotifyFill.fillCount = NotifyFill.fillCount;
userNotifyFill.fillPrice = NotifyFill.fillPrice;
arrayNotifyFill[arrayNotifyFill.length] = userNotifyFill;
Array 객체의 length 프로퍼티 는 배열의 개수니까 OnNotifyFill 이벤트가 발생할때마다
배열의 마지막 요소로 추가됩니다.
function SaveNotifyFill(UserNotifyFillArray)
{
// 배열의 개수 저장, 읽을 때 저장한 개수만큼 읽어야 하니까
Main.SetUserValue("ArrayCount", UserNotifyFillArray.length);
for (var i=0; i < UserNotifyFillArray.length; i++)
{
// Array0_code, Array1_code, Array2_code, ... 이런식으로 이름이 만들어지겠죠
Main.SetUserValue("Array" + i + "_code", UserNotifyFillArray[i].code);
Main.SetUserValue("Array" + i + "_fillCount", UserNotifyFillArray[i].fillCount);
Main.SetUserValue("Array" + i + "_fillPrice", UserNotifyFillArray[i].fillPrice);
}
}
이렇게 함수를 만들고 SaveNotifyFill(arrayNotifyFill); 이렇게 실행하면 배열의 내용을 저장하게 됩니다.
이렇게 저장한 값을 읽을 때는 반대로 개수부터 읽고 개수만큼 반복해가면서 arrayNotifyFill 배열에 추가하면 됩니다.
그런데 어차피 하나의 전략에서 관리하게 되니 굳이 SaveNotifyFill 함수를 사용자정의 함수로
만들 필요는 없겠죠? 그럼 매개변수로 배열을 넘겨줄필요없이 함수 내에서 바로 사용하면 되구요.
문제는 OnNotifyFill 이벤트가 발생했을 때 배열을 검색해서 같은 종목이 있을 때죠.
어떻게 효율적으로 찾아서 관리해 나갈지는 님의 몫입니다. ^^ (힌트 : 순차배열, 이진검색)
또한, 님의 의도대로 여러 전략의 여러 종목들을 관리하는 것도 제가 드린 힌트를 토대로
작성할 수 있습니다.
PS. 끝맺으려다 시간이 좀더 생겨 저장한 값을 읽어들이는 함수까지는 알려드릴까 합니다. ^^
function ReadNotifyFill() // 사용자정의함수로 만들지 않으니 매개변수없이 직접 사용
{
var count = Main.GetUserValue("ArrayCount");
for (var i=0; i < count; i++)
{
var userNotifyFill = new UserNotifyFill();
userNotifyFill.code = Main.GetUserValue("Array" + i + "_code");
userNotifyFill.fillCount = Main.GetUserValue("Array" + i + "_fillCount");
userNotifyFill.fillPrice = Main.GetUserValue("Array" + i + "_fillPrice");
arrayNotifyFill[i] = userNotifyFill;
}
}
> brucehan 님이 쓴 글입니다.
> 제목 : Re : 여러 종목 진입시 함수객체의 유용성?
>
1. 답변해주신 아래 식에서
function SaveNotifyFill(sName, NotifyFill)
{
Main.SetUserValue(sName + "_code", NorifyFill.code); // 종목코드
Main.SetUserValue(sName + "_fillCount", NorifyFill.fillCount); // 체결수량
Main.SetUserValue(sName + "_fillPrice", NorifyFill.fillPrice); // 체결가격
}
=> 옵션합성전략인 경우 한번에 여러 종목들이 진입하는데요
체결통보 올적마다 위의 식으로 처리하려면 어떻게 하나요?
좀 간편한 방법이 있었으면 합니다.
2. 답변해 주신 아래 함수객체에서요
function UserNotifyFill()
{
this.code = "";
this.fillCount = 0;
this.fillPrice = 0;
}
------------------------------------------------------------
var userNotifyFill = new UserNotifyFill();
userNotifyFill.code = Main.GetUserValue("AAA_code");
userNotifyFill.fillCount = Main.GetUserValue("AAA_fillCount");
userNotifyFill.fillPrice = Main.GetUserValue("AAA_fillPrice");
위에서 말한 합성전략처럼 한번에 여러 종목들이 진입할때
함수객체를 써서 편하게 전략을 짤 수 있는 방법이 있었으면 합니다
함수객체가 편한 것 같긴한데
위의 경우처럼 배열성격을 갖는 여러종목들이 진입할 때에도
과연 유
brucehan
2013-10-24 19:17:25
> 불꽃기사 님이 쓴 글입니다.
> 제목 : Re : Re : 여러 종목 진입시 함수객체의 유용성?
> 댓글은 여기까지만... 힌트만 드리도록 하겠습니다. ^^
우선 1.
여러 전략들이 사용자정의함수를 같이 쓴다고 하셔서 전략명을 키로 잡은 건데
거기에 여러 종목들을 같이 관리해야 한다면 종목코드를 키에 추가해야겠죠
var key = sName + NotifyFill.code;
Main.SetUserValue(key + "_fillCount", NorifyFill.fillCount);
전략명이 AAA고 연결선물이라면 "AAA00000000_fillCount" 라는 이름으로 체결수량이 저장되겠죠.
다음 2.
먼저 여러 전략들의 여러 종목들을 관리하기는 힘듭니다.
물론, 못 하는 건 아니지만 스크립트가 복잡해지고 관리를 위해 계속 파일을 뒤져야
하기 때문에 속도도 드리지고 나중에 파악하기도 힘들겁니다.
따라서 하나의 스팟전략에서 여러 개의 종목을 관리해가며 값을 저장하는 방법만 알려드리죠.
함수의 매개변수로 NotifyFill 객체를 입력한 것을 이제 UserNofityFill 객체의 배열로 바꿉니다.
UserNotifyFill 은 OnNotifyFill 이벤트에서 만들어서 관리합니다.
var arrayNotifyFill = new Array();
-------------------------------------
var userNotifyFill = new UserNotifyFill();
userNotifyFill.code = NotifyFill.code;
userNotifyFill.fillCount = NotifyFill.fillCount;
userNotifyFill.fillPrice = NotifyFill.fillPrice;
arrayNotifyFill[arrayNotifyFill.length] = userNotifyFill;
Array 객체의 length 프로퍼티 는 배열의 개수니까 OnNotifyFill 이벤트가 발생할때마다
배열의 마지막 요소로 추가됩니다.
function SaveNotifyFill(UserNotifyFillArray)
{
// 배열의 개수 저장, 읽을 때 저장한 개수만큼 읽어야 하니까
Main.SetUserValue("ArrayCount", UserNotifyFillArray.length);
for (var i=0; i < UserNotifyFillArray.length; i++)
{
// Array0_code, Array1_code, Array2_code, ... 이런식으로 이름이 만들어지겠죠
Main.SetUserValue("Array" + i + "_code", UserNotifyFillArray[i].code);
Main.SetUserValue("Array" + i + "_fillCount", UserNotifyFillArray[i].fillCount);
Main.SetUserValue("Array" + i + "_fillPrice", UserNotifyFillArray[i].fillPrice);
}
}
이렇게 함수를 만들고 SaveNotifyFill(arrayNotifyFill); 이렇게 실행하면 배열의 내용을 저장하게 됩니다.
이렇게 저장한 값을 읽을 때는 반대로 개수부터 읽고 개수만큼 반복해가면서 arrayNotifyFill 배열에 추가하면 됩니다.
그런데 어차피 하나의 전략에서 관리하게 되니 굳이 SaveNotifyFill 함수를 사용자정의 함수로
만들 필요는 없겠죠? 그럼 매개변수로 배열을 넘겨줄필요없이 함수 내에서 바로 사용하면 되구요.
문제는 OnNotifyFill 이벤트가 발생했을 때 배열을 검색해서 같은 종목이 있을 때죠.
어떻게 효율적으로 찾아서 관리해 나갈지는 님의 몫입니다. ^^ (힌트 : 순차배열, 이진검색)
또한, 님의 의도대로 여러 전략의 여러 종목들을 관리하는 것도 제가 드린 힌트를 토대로
작성할 수 있습니다.
PS. 끝맺으려다 시간이 좀더 생겨 저장한 값을 읽어들이는 함수까지는 알려드릴까 합니다. ^^
function ReadNotifyFill() // 사용자정의함수로 만들지 않으니 매개변수없이 직접 사용
{
var count = Main.GetUserValue("ArrayCount");
for (var i=0; i < count; i++)
{
var userNotifyFill = new UserNotifyFill();
userNotifyFill.code = Main.GetUserValue("Array" + i + "_code");
userNotifyFill.fillCount = Main.GetUserValue("Array" + i + "_fillCount");
userNotifyFill.fillPrice = Main.GetUserValue("Array" + i + "_fillPrice");
arrayNotifyFill[i] = userNotifyFill;
}
}
> brucehan 님이 쓴 글입니다.
> 제목 : Re : 여러 종목 진입시 함수객체의 유용성?
>
1. 답변해주신 아래 식에서
function SaveNotifyFill(sName, NotifyFill)
{
Main.SetUserValue(sName + "_code", NorifyFill.code); // 종목코드
Main.SetUserValue(sName + "_fillCount", NorifyFill.fillCount); // 체결수량
Main.SetUserValue(sName + "_fillPrice", NorifyFill.fillPrice); // 체결가격
}
=> 옵션합성전략인 경우 한번에 여러 종목들이 진입하는데요
체결통보 올적마다 위의 식으로 처리하려면 어떻게 하나요?
좀 간편한 방법이 있었으면 합니다.
2. 답변해 주신 아래 함수객체에서요
function UserNotifyFill()
{
this.code = "";
this.fillCount = 0;
this.fillPrice = 0;
}
------------------------------------------------------------
var userNotifyFill = new UserNotifyFill();
userNotifyFill.code = Main.GetUserValue("AAA_code");
userNotifyFill.fillCount = Main.GetUserValue("AAA_fillCount");
userNotifyFill.fillPrice = Main.GetUserValue("AAA_fillPrice");
위에서 말한 합성전략처럼 한번에 여러 종목들이 진입할때
함수객체를 써서 편하게 전략을 짤 수 있는 방법이 있었으면 합니다
함수객체가 편한 것 같긴한데
위의 경우처럼 배열성격을 갖는 여러종목들이 진입할 때에도
과연 유