1001010011100100111101101011100110010001011100010110000101001101111110110110111000110101110111111011000111100111001110010010111011010101010100100100001001110000101110101001110000011100011000001011110101101011110010101100011001111110101010011000100011111000011010001111001110010001010101001001001100110101101111000010111110010110111011011000010111001111000000110001100011001110110111100011110100111011 0101000001100110101101101010010111000001001001101010100000101001000000011101001100101111110000010110101000101101011010000010001001101011110010001000110010001101110011100100001101000010011011100010011111111011111011011111010010110010110011100101100001101100000101011110110001111111001101001000101000011111101000000010100011100100110111101010110000000001010001000101100000011100110001001011110001001000 1010111000000100111110011101110011000000101111011101100110001111011001000110110000111000010001111010110110010010111010111011111110111111110000000010101000010011100100000011101010011100100000100111000101110001000100000000111011110111100100101000010000000111011101000010110011100011000111111010010000101111100110011101100011001001000110001001110000100001010110101110001001000100011010011100010101101010 1010010000111111011101001001100110101010001110000010011011000011100001111111100111001100110110111100100101000010000010111100111111110101110101100111010010011001101101000000111100011110000101101101000001011100110001101010000010000011101001000001111110100110100001001001111110010000001010111000011100001001110000011111010101111100110110001100100010110101000101110100001000010110110001101000101011000001 1011100100010101101110010000011011010000100010000111010001011011101100001000000010010011011100001011000000110100001001010001010000111010011010010000110001000111100110110010100000100100000111110001101011011001110010000110001110001010111000001101100100100000111100100110100000001010110111001011100010001000100011100000000001111100100001010110111000000111101101111000000111111011110000011010100111011000 1001100010101111010001011001110111011111101111110010100101001011110011101111011100110000101110110100111001111100100001000000001100000010011100111000011010000110101011100110011100010100001011100100110101111101111001001000111110000010100111100111010010000010110111000000111010100110011110010000110100101010000101100001110101000010111010100011010101011001011011011111010011111010010011101100010101001100 0100010111010110110100110011111000010011111100101100011001101001000011100011101010100100110010001111010010001111010000000100000010111111010111100010100001001001110011001010001010101010110110001100000010110011010010000111110100101010011111011111110010011111011011011110110101011110110000110010111100110100101101010110100100110001100001100111011001100111001100000111110000101101000101010011100001001001 0100110111000001110000001101011001110101110001111110001001001110010001001001110010101101011110100110100010100000111100111010111100110011101000110110011100010010110101010000101101101000100110001100010011000011111111110110000011110000011000000001000101001100111010010101111010011110111010000010001100001100110100010010100111001010110110010100101010010111011110001101110010110111110001101111011110100101 1000110111001100111101100100001101111010011101010111010010011111010010011111000111101001111110001110110100001111111011101111001000011101101010000110011111111001001011111111011010111110001110001010001100101101101000100101010100111101111001100011010001101010010110100000011100111101101111001111100110011011001000011110101011011101110111101111101111110100000111111000011100010001101001100011000000001110 0010101101110110010100100011001111010111110111101110001111110100111100010011011100101110101011010110001001001110101000110001111010000000011001101001111110101011001000001011101001000100110100111100001001001011011111000011111000101100011000110111100001010001000101001100110011000010110100001111001000100100100100100100111010101111011110010101010000100011000000100011100010011101000000011000101101100110 0100001100000101101110110101101011001100011111100011010000110011100101100100111000000100011110010001111101001111111011011010101100011011100110111101110110101000111101101010000011110110110110011110110110100000110111101110111000100010111111011110101010001100010001110011011101001110100110111101010000010001010101101000001101110110110111011000110111000001000001000100111110011101101011011011010110100001 1000000001011110011011110110110001010110011111000010101110110110010101010111001111111001101101010011111101010011111010101111000101111010000101011110010101111000110100111010001110001011100101110110110100010011000010001111001011111110101000110110001110110010101111100001111010100000111010000000010011010001100010100111000100111001111110101001000110010000111011011011011000001011100100011010111110100010 0101011111011111011100101011010101001011010011001001110101111100110001111110000111010011001100001100110011101000000101100111010001100001000010110111100000100001000011010001010011011001001101010100111110111111001111010101000011001111110011100110110101110001000110111001111000001100011001011000000010010000101000110101101111001011110100101000000011111010011010101100110111011000011000000011011010001010 0010110100010000000110110110101110111000010011001110010011111110000001010101001111101111101000101111111111011101101011101100000100101000001110111010100111111010100100001010001011001110011010000111000101100110100100000010000100110010001011010010101101110100010011101111101000000111000011111110011001001110111101100001011101010111011000110101001101001011100111010001111111100001110101010110010110100000 0100011110010000001111000110101111111110010110111001100001000111111011110110111001110011100110001100000110101010100000111010000001100011011100001111110100101100001111111011010011010011011100010111100100110100011101011101111100011000010101011011001110100101111100000101011101110110111011010001101010010110100101011001111000011101000110110000011100110001001011010111010111010111000011110111100100010100 0111010011101000101000111110000101110000100011000101101111011100110010001001010100010110111111001110001101101001100000110110100010011001010100111000100001001111011101010000000100101001110010110001000000001010011000011011110010101111011111110000000000101111011001101001100011001110000111111101011101001100011111010100110111010110011101110001110111110000111100100011100010101101101000010110000001000111 0111111101111111000000001110111111011010010011010111011100000101101000100110001110101101000101110101000011010000001111101001100101001001101010100000101001101110000100110101110101000100010000011100110010010110100110100101101101001111001000000001011111111100101110011111110100110110100011101101101001011001100010011110111101000100111011000001010110010010110011011011011011001001001110100010100011000010 1000110011100101100000111100010111101111111100111101001010110101000001000011101010101010010011011001111101001111010101001010110001000010110010010111110111001001110010101101100110011011001011011000110011010000011010110001110110110101110001000011001101110001111010000001000111100100011110101100101110000101010110101101100100010000000111110010110010101001001010110100000111000111101101011110000100011111 1101100111001001110110111010001010001101100010010001001000010001100001110001000011100100101011110110011100000110011010010011111100100110001011010111010110001001001111101101101001011110010110010011110111100001110100010011011000101100111100010110010101110001011000111000111101101000001011101100000111001110110000000000011000110011110111001001000100011111010011010010110011101010110100111001110110110111 0010100011000111101001010111110001000111111100010010000110011101110000110111001001110111000100010111000111011001101101110010100011101100000011111100100011110101111000001101010011100011000011011010110000001110100100000101011111001111011111001111001110101011000100111111011101011011001110111100001110001110001110101011110110111110101000001011101010000011001101111000011000111110110100001111110011111001 1011100001000010010110000001010001100000100111111110101011000010111010011100010100101000100000100000010001000100011010110000100011011001100110100110110110110011100111000100111111111110010111110110001001010001011000010010000100000000010110011101110101000110100101110100001101101100011010111110010011011011000011100100010100110001011101010101000000100110101111111101101010010010110110000100100011000111 1100011100111010000110010010000110000001101000100011100111001100000011101110000101001101010001110010001101111011011000101111010100000000111101011010010000000000000001011101000110100100001001111111001100000111111111100000110111011000001000100000101001111100000110001110100111011100110000011010000001111111110000100111000001101000101101110101001000111000011100010110010000110111010111110011001010110001 1011011110001011110101000011010011010100000100000111001001100001001100110100000100110101101111110110110001100111111111001110001010101011000001001000101011111101110111101101100010110011011110001000000011011000101111111111011110001010111001000000001111010001011000101111000010000110100001010101101110000100111010010101101100111000000010001101011100011110000010101000111001010111101011111111001011101000 1100000110110001101100101101101001110101010100000010110100101111000101110100011100110110011101011111000001111100101001110110000011001011100110010110011001100001010110100110100000111010100000111111101111001100001111110000000000010100000011000111110010111001010101010001000101000010001110001100011011000000100000001000001101011100100110001111111100111000001111111101111110101110000000101110100010001000 1110111110001011011010100011010101010001001111111000011101001100101101001101000101000011111010010011110000100101001001010111001011111110100001111101101010010111011011110101100100011100111000101101001100000111011110100111100001000000011011100010011000011101000101010011011100011010101101110010010000110011101101101101011110000001001100100101010000101100110000101010011110010011101111001000111001110001 1111100100111011111100000100011100111100001001001001001000000100111111110001001001011010000100011010100101111111000001110001001001010111010010110001111111010111101110101110010100110101101001000110110111000110111110010010111011110110011011111001011101111100010010100110011001010000111100101100010000010101010001111111110110011111001001010100111000011010011100010011011000110110000000100101010101010010 0111101001101100101110110011001010011010110001110111011101011000000000110101011110110001001101010010001101100101010001010100000110001001011110000111100010010100101010011000010001101110111101111000110110010000010011010010010110011001010011011011001000101011100110110010011010011001101111110111111000000111010100011101110101011001110001101011111000011001101100010011011010011000010110100101101010100010 0001110100100011111011010001101101111000001010110100000011101110000101110011001100011001110110011001110001110110010011101100111110111101010110010011010100101011011100111010001101011000101001111111011001100001001010111110011010101010111101100110001010001110111010110000111100010101110101000011001111001110110110111110101010010110101001001001010111010101110010010110101111000111111000101001000011000110 1010110000000110100000001111001101101010100001000011111101010010010110110010010000101101011110101100010110010000101001001011110100001110011101101001101001110111110010011101010010101100111010110000111110101110111110000011100001100000111111011010000101101110000110000001111000101100100101001100010010101110010000011011000000111010110111001000100110011000111100101001100011011111111101100001001010110110 1110100100000111111110110001110100011010101101110001100010101011110100000111001101010000101100011001100010011101111100111001100101000001100101000010100010111101110000011000000100101110010100111100101000101110001101010111110110010010100010100000000010001110100111100111111100011010110000110101111011100101111000111010000000100011001001010001101001000010011111011110000110011100001011111100110001111000 0001001110010100101111010101101000000110000110001111110110111111000101000111111111000111000000111011111101101010011101100111011110010111101100000010111010100111111110011110110100011000000110011011100000000110010111110000100000100000100101011001100111000100000011011000000001000000101010010010001111000100101101111001110000001001001100001001011001000011001011111010010110010111011111100110101110001001 0111010011101101010110111110010100100111000011011111010110110010000111100111011010010100111001100101100101010111101010011000000010111101110111110011100010110011010011110100101110111100100111101111010001111111100001001000000110001101000001100101110111101010101001001000010011001110010100100010001101010100101010100011100001111100110011011001111000101101110001101101101000101000100111100011101100011010 1111110100101110010111101101110111101011101100111001100000011000000010101101000101111101111011101101111001011001010011011011000011010110001010101000010101100101011101011011100110010000100110001001000111100101111100000100111100110010001011100010111011010001100011001111101010001010101001010000011010110111111011111111000011010011111001100000110000010001101111101110100000101111001101100110101100001001 0010111110000001001010001011011100100000000001110011110111000001010100000111011111011101111010101110001110101101000111011110010100101111110100010011001111101100011111010010000100011001110010100100001110101001000000100011010011010111111101010110001000010101011011101001100101111111111110010100011111000100101000101111110011001001011011011011001100101110010110111100100001110101100011001010000001001110 1100001110001111111010110001101111110010011010110010010111110000011101011011011101100101001101101111011010001001010101000101111100100111100001001111001100101101001101100010110111110000101110101011110010111101111010000101110010000101101100100011000010010001000010010100111100001011111010111011000111000110011111110101001100001101100110111011000101000100100111010101010101101011011111010111000000111111 0110110101001000110100100110101111110010000011010001110000000111110100101001010000000011110001100110001001011101001010011111111001000000001011111110111011000010011110001010011110011111101010011001110000010101000001111011000110000100110101010110111100001100101111010011110101110110101111111001000011111101110100010010000011010001010111011001110001111001010101000101001011011101000000101011110011100110 0110010001001100111001000110101101001000111110000011001101000111001111010100111100110101000110110011100001001111000010110101010101110110011101011111010110011100110001101111110001100110010100011100110000011101101000001010001001011011110011101010011011101111010110110101100111000110110010011100001011100101010010100101100101111111101111100110010100000000111011111000010000111110000000110001001100100111 1111111001110100110011001001000110001110110000110101001001110010111010111010101000101110111110000011011101011001110110011101110001100001100110111110111101101010010111111001011101101101010101011111011011101001010110011110111110011000101000011100010000100100011010100000000010010101001000011001011000101100000001010100101110101110000000100001000010011000011101110110101010100000010011001011101111000110 1001001101101010111100011111000010100100101110011000000101110001010111001101101101010101111100101000000001101100001100111000001001001010000110010111111011111001010100011001110100111011001010011001001010101011010011010100101001001111101000110011010100001101001101010001001011100011111000110011010110011111110100111000100010101001110100110001110110100100100110011010001100010000011111110000011100101011 1100100110110111111000011010110100100111011000011100001011011100110111101101001011111110100011010010101111010011101011100010000110011001000100111000010001101111110011100010011010111100110101011001110000000101110000010101000010001010000111000001101001111000011111010011100011100010011110101001111111100101110111110110110111110110001001111011110010000011011011001111100010000101000010111111001111100110 1111001010100001101111110111111110110010100010000111001001000001010100010011000110001010010110001101111110110111001101010100001100011110100011111111001001100111001000001010111101111111101110100001100010101101001110110100110110101000010000000011001111101010100001110101010001000011101110100100001010111010110101000111100011111010111010000011010000101100000100000101101001111011011010110000110001001010 1101000011010001111010111101010010010111001100111110101100110100010010011000110111000101100110110001011000000111100010101110000101001111000010111100000110100110000100010001100011100011011111000011110000000111010000111101101010011010000010100110011010010011011111100110110001100111111100011010011101001011000110111000001000110110101111010000000111010110110000001001010001100000101100010001010011100010 0011010100100000011000010101000111101111111010111101101001100010010110010001101111001000100000001001101100100100110011110001011010001011001100010001111111100111111111100000001110110001110111001000111010000111101101010001010000101111100110101101101010000100010101110101000000011101011101110011110100100111010101011000010011011000110001100111010110010000101100111110000010111011000110101010111001001010 1000100101111001110011001001100110101001111001011010010011100110100011111011111100000100001110110001100111101011010111111011000101110000011010111101011100010110011100001111101110100000111110111111001001000110110110110010111000110001011111110011101111101000000000001101010000100010100101011100111100101010111000110100001000010010110011110010101111111111110011010011011110100000011100011110011101101111 1000010000110100000110101101101001001101011011010011111001000001001111110110101000100010011111010010011001011001100010011101110000001011100100011000101100001110001001101000000010100001000001110010001101100010111100110110011000011111010110001110010000011011100010110010111000010111011101001101111000111101100000100001000100110001011001001001101001111001111001100110001001101011001011110111001010000011 0011101101100011011010101011110111101101111101110100111110011101101100000100011101110001111001000000001011111000101000011101111001101101101010000000100000110110001100010100101010110110111111001111001000110010001001100000001110100100011111011101000101100100010011001000100001100000001111000001110110110010101100000110110101001100111011111010101010100111011011000010100101000100010001111110110111111100 0101011001100001111111011001010000001111000110100100100001110101101110101100101011101100010000100000100101010000110101100111101101110100110010001101011001111110101001010101111111000010110001000000011111111010100011110011111101011010010000110001011001111111100111011000000000111011011011000001011111110100101101001011110111100110011010111101010000101010001011110110111110110100101101000110110110010001 1011111110100011110101000110010110101010010101011010110110000010010111000000111000101100111000011110000011010101111100011111010010010010010010101011011001001110100001111001011111110001001010111001101111110000100001110101010000110011111001000100110100110001111101110011100010001011010110111100111101100000010000011011010110010001101100100110101000010001001010100100101101101111110000000000000110110110 0011111000001100010011101001110111100110001100100111110100001100100100001101100001000101011001100001110110010101010100110000111111001101011101101100100011111110101101000101011000011010101100001001011111100111011111111100101110010110100001110110001101110001010000110100000010100000001110000110111010100100100110111011100111110001110101111100011111111111111100000101000110110010010110101100111001100101 1101000011001010110110100111110001011000000100000000000000011111001000101010000110000110011010111011010010011000100000100101111101000010000001101001111101101011101100001100011001011010100011110001000100010101100100000100010111111101000110101010000101100011100110101000111100110010101011010001101010000010110100010110100110010001011101000010111011110010101011111110100101100101110011101110110110101101 0101100101000011001101010111010111001010101110011011010001010010000010111010010110100111100000000011100011001001101000111101001001100100010111011000110010101100111100011000011010100111010101111001000011110000100001010101001001010011100110010101001000010011100100001000001100101011000000001110001100001000100011011001111011101011001011000001010000101001000000110110100110011111110000111011100000000110 1110001010001011000111001001000010100100111100010110010011110011110110110010010110001101010010101001001001100110001011110100000001000101110010010100100010010010001001000001000101011000110101101110111110010101001111101010100010010101111010010110000111101001001001110101111001100001111101110101111101010011011011010000110000101010100000101000111000110011111000101111111101110010110001000010010111101110 0000011011110001010000011111101100110000110110110011000001011111101110000010001010000010010100011010001011101110110011000000000000001011111111100010010010101001001111101111100111001000011100000001110000101011110010000011110110000101010001111010000100000111001101011010111110010011101000001011111001110101101101011110100010011101100111010111010110100001000110110100010000000100100011111010001100001100 1111101110111000111010010101010110101110100000101010101110100010011001001010001001011011010100111100011111111000111110010001110011001011100111000011011111101001111100011101111110010011100001101000010011110111010000111001110111110010011010101010001000010011011010110100001011101110000100111001010111101000001011011001011111000000111101110101100101110101001110101111001011011011111101111101101100010111 1011011001000010110001111101100100111001100101010010111111010011111001000110010110010110001110110011001000101110100111100101100000010110011011001101110110011111100001011001101000010111100110000001110100100110100010111010100011111100010101101000001001101110000101001001111001010000110101101010001100101101000000111010110111011001011101011001100110101010000111101110010100000000010001101101011100101011 1010100100001101010111111000100000001111101000000101101000100111000001000000000111110011010010101010101000010001001100001100101100111110110010110000110011001101001010101101111110100100111001000000100101101000111101111010011011010011101011000101111010001110011000001011110010000001110100000101000110011100100111000010100110100000110110010110101110011001111111000000100001010110100001000101011110001011 0110100001000010101011100010000111111000010001100011000111011101100000010010110101101010010011110000011011100000000101011011010111011011000000100100100101000010000101000101001010000010101001010101000010001100110001100001010010011101110111000100011100001010101001101110100000010000011000010001000011101110111101110001011110001001000011101000111110101110010110110101100001010111001011110011011100111000 0011001101010010110001000111110100111001100110001111110101110000100101000101111110010010011010000111110110011000101100010001000001000101111011011101001101110111111000110011100110000100100111011100010100101101000010110111111010111000001110010000011101000110111010101100000010001011111010000010001000000101001000101110000001110001101000010100110010011100111000010011011100111111010100011010001001110110 0001001010110111010001000101011111110100100110000111010000100000100010101111000101110001100000101111110010100101010101000010001010011101001001000010011101010110010011110100100011100010010001000010100101000000110110101010110101111001010110111111000111011100000010010111100001111001011100010100000100010000110000011000100110010101110001101101111111010101101001100110100100110010011110001101111010001100 1011000110111000000000101000011100000100100010110100101011100010010110101010000111000010100101101010111110010000110011011101111101000110110011000111001011100011000111001111001101111111010101101111010111011001101011110110110011011111001100100100101110111111101100100111001110101001100000010011111101000001110000111100110001010110011111000111101000011011111011010001011111010110111001010101000110000111 0010001000101100011110101111001110110100101001000000010100101001110101010010101001101101100000001100110111110110010011100001110110111011110010001011101100010101010010101100010001001110110101010011011110011100111000010101000100101011000001101101100111110111010101110011000101000001010011011010011100010100111001101001010111100111011000001011000000110011001011000101000001010100001110101000101101010010 0011000101011101100011000100000000010101101110000110100100001001011111001101011001001001010101101001001101101010101000100100000101010000110110110100011101111111010010000100101011111100100010110010110010011001101100001001010101011011111101011110010001011110001110111110011101110001101000101100111011011111111001100100110011110010100101100001101001110011111100110001110010100101111100001000010000001011 0110111101010101100100001011000101111101110010001111010100000011011110000000010010001110100001001001111000110011101101010010001010110011110100011011101010100111010000111100000100010100110011000111111001001101000011111100000101001111100011000011110110110101001101111100011100010110110100111100101000011011111011101001100001001000001010010000100001111000010101110011100101010101100110111010100111011111 1100011110001111001001010111101011111100010010011000110001111010001110111100101111111100001111110011011110100010000101111101101000011000001011101100000000110100110111010101110101011101010100111000100111100111111101011100101110111000100010111111010110000111100011011011010100110011110111000111001010100111100101001100100100010100011001010010100100100010011001010000000110011101001100110111010100001010 1111011111111111000010111000010011110011011001110011001011011000011011000001110011010111011001010001110010101110011010010111000101110010101011010110001110000110000001000111001100100111011010011101110101101111010001110111110011000011001011110010010001011001111101111101011111110010100100010111101100100010000000101010110010111011011111011111011000111111111101011001100001111011011111111100010011010101 0100001011101010000001011011101011011110100101100001010000110100000110110011011000010000100101001001100100011010111101101000111110110111100101111001011110001000110010000101111000011011111100101001100010110100101001000111111111010000101001011001110010111110011001100011111010111111001100100010010100000101110101000101111000100001101100110101000000000111001011111001010010111101010111111010011100000001 1000010001010011111001101001001001111000110101000100100011001111101001111110011010011101011000111000101011100110111001000101011111110110101001010101101110100000011010010100110011101010010000001111100100000110000010010011101111111100010010101000010101010100000110010001110101101000011111111111011000001011111111011000110011010101011110010000010101011000101000100100010100110000111100110101100100110111 1011110011110011001100001000101100000011010101101111101111011001100010110000001101100101010100110011111110010011100001100010001110101001110010011011000111001001101000101111001100100000100001010100001000010100010011101111010100100001100100101011000110010111011010011111110011001100000011011100111001011111000101000010010000111000110101001111110111001001001111010011101111111111101100101101101010011110 1001010110011011001001111001101010000001001101011111010100001011011000011100011011010011001110101010100001111110101010110110101010110010111110010010001000110111001000000110110111010110100000110000101110010011001011100011000001101010110011011100010110110110111001001001011011010010010101011110000110010100010001010001110101001001111111110101001110101000000011110001100110101110100001101001101011110001 1100000010100101101101101101100111110010001110101001100011011111011001111100011001000101011011110100001000100100000000001011111111001111101000010101101001100110010001001010001010010101110011101110111010101011110000011011010010000010111110111001010100001111111011010101010011000110101011001110110110110001101011110001011100010101010100001000100101100100111000010010111001000010100101010000110110000000 0110101101110010111010000111111001101110001111100110011010111001000101111000010100010100111011001001011010101011011110010001110000011011100001001110101100010110000010001011111011111100011100010001011110011101011010100101010111110110101111110110000000100110001010011101011110100001011000000110110000101000001110101101010110001101000110100010001010001110111111010101010111110110011100111101000110011011 1011001001001010000000101001101001100010111011101110011101000101000100011011111000101010110101110111000111001001110000000111010000000100111000100000011101101110001000101010000001010001000000011001100100001110111010011110100100111001001010010010101001000110001000011010000001110000100011000111100101011100001101111010010011011001011001010000001001100000101011110000111001100100000110110000010101010101 1010011100010111001110000011111111010010011101000101001110111100110001011100000101010111111111111110001100011010000110000011111010111100110001010011000010110000001100010001011000010111111000100000111101011010010010110010111011111100111111100000010010010111101000001011100010110111011011100001010111110011001101001011001111110110111101000101011100000000000010010011000011101000111100111100011010000001 0110101010011110011100010001110010000110110000100110111001011101110011101111111011000111011100111100000000011111111010011111011001010001011110110110100110011000000000010111101111011110100000101100001100111001100010010010010010100100111110101101100101100001111011110001111101011001100001100010010110111110011110010000001000110010111111011101011000111010011100010010010001110111110001100110110101111010 1011100111010010101010101110110101011110011001101110110110001011111010101101111101101100110100110110101101111101000000101101010101000100001001001011100110001111111011101101000101000111100100100100101101111010011011001010110000101110010100110001100010101101000100010110001001100101111111001101010010001000111001010000010010110011001001110110111010111001001100101111010000000011000010110100011011001101 0111010111010010000011111100110111110010101100010111111001100110010010000011001010111110010000001111100000001001010110001111100111111111101100100011000110001011110011100100011101101101010100001010001011001011011100010101001110110111010100010100011100110000100010110010001000101000111000011101011111101100001010101100011000101110111001010100110111110100001111011000110111001110111000100100100011011110 1010100011111010101101000010101010111010110101010000111110011111110101001011001000100001010111000111111011110111010000010101110110101100101011110000000101001110000000010100010111100001100011010101010110100011010001101111011101001101110110011111000100110000101000111101010100011001110100010011000001111000000011111111000010010001001011001100010111000111101001011100111011011011001100000001011111010101 1110001100011100011101100100110001010110101111111100001000110101101101101110100010111101001010111100001110110010110101001010101110000011110100001111001000111101001001100011100101000111011100100110101011101011100111111010011111101101100000110111110010011100001101001001011000100000101000111001100001010111010001010111101001011110100101101100101011011100101011010111001000011011100111101011111100010010 1111110010011100001101111000000011111011110100010111110101100001101011011011011100101010011000101100001100101011100110111100111101000001100001010100101010001000101011101000001100010111010011001011001011001011100011010100011001110010101011111101101001111110100100001010111110111011000001011001101000110001010000111010110001000001110111111011010000101000101001111101010001111110111010010100100010001000 0000011011101001000100110011110011111100111011011001000000110110111100011111000111111110001000101011010001011001011010001010111010100100111011000111010001111011011101000001111000010000101111010101010110100101010011100001001100111001001100001111111001100010110001000000110111111000011010011101101110101110101100011010110101111001000001101010100110001011000101011011100010101001011101011010111110111110 1111101010111100101101110011100000100001101000110101110110001100010011111001100100111101101000000001100010001011110001101110011100010001011011100010100000101100010001001001001001100111101010100100101100110000011000000100110110000110011100101001011011100001011110100101101110001011100000101111101110011101000010101011101100011101011100100001110010110101010111000011001111001101110100001001111110011110 1001011111010011100110100111101010000011001100001011111101010000011111101100011001001111100011100001011001001101111110101001010011111000000110101010111110011001101001101000010101101111100110010001110111011010101101101010010011111011000101000110101110111010001001000111000111011001010111001011111111101110000001001111111101110101001010000011100010010010010111001011010010101000110111000101111010011101 1001010111101011001100001100100000110001001000001010100011010110110110011000100100000000111001010101000010010000111111111011100100100100110011010100111010110001111111011100100001111110101011110000001000111110111010111000011001101010110001011110011110000110011101001101011001010111000001110101100111001101011100011000001001100100001010010111001110000000001111000111011011011111111101011111001111011001 0111100001011100101010000101001010111111111110011001000010000000010101111111001111111111010101001000000000101101111100000111011000100000110011010000101101101011110011100110001001011011010111101001010000010110101101010001011110010101000000011011111000010010111110001111101000000100011011111110110100100100000101000110110011100011110101111010001111010100011101000101010110010011010011111100100111000111 0011010001000110010000000101001100110100100000011101010100110000010000010111101001101010010111101010011101010011011000110000001000001101101111101011100001110011101000111110101010100001001100101111011111011111110100001011010100010000001010001100001000010111101000010100011111010010111100100011001010001110100010110101010111011101100011101001100000101000001001000111111001011101100100011100100011011111 1110000001010111110100011001010001100001010010111110111100110110110010100010001010100010010111100011011010110110101011011111100100010010110110010101000001111100111101110100001101011101110111011111001011000001101011011001101000111001110111001001001001100100100110001010011110000101100111000010110110000001101100110011001001100010111110110110110110101111011011100111101000101010101110100011001001100010 1101101011011101010100101011100001001100010001011000111100100010000001001000011011101001001000000001001000101101001011110100100011001101011101000010110000101110101110000001000100100001000000111100110001111001111100111011011000111100110001000001111000011001100111011111001001101100110100010111001011001101111001011011001011111000101111101111110001100110011110010001010010100011100100011010011101111000 0011000100100110000101111010111000001001011001101000110010110001110110000011011101111001011011001110100110101111010101000010000001011001110100110101011011111100110101010011110111000001010110001100100000101100000000010011001011100110001111000100001001111011001111010011011010110011011101011001101001111000001001000000110010001000111101000100110110101110000010101100111000111011000000011101100000001000 1110101101101110111100101010010010111010110000100001101111101110111111000000100111011001010111010011000011000100101010010001001011011100110001010011100000101110011000100111000001001111000101100010010111010111101011010000111101101011001001011010100100101111011101010010000110100100011001010010001010110110111001001001010100010011100011100111001110111011100010100100111101100001001010001110101000100100 0111100000110001110111100011101101101000001011110101001001011101111001101111101001100101011100001110110100011111111111110001100111101000101111001010011011010100000010010101101101111011100100100000111101101011001101010000101110001111110110111101001110001111100100100110001000010000100110011101100111000011010101000110011110111000001100001111011001111111101110111101101001110000010000010100100101101010 0111110101101111000001001010111101011001001010001100000001011001110001110010010010101101101001110110011010001011101011001000010010101001100000001110111111100010011010110100101011001100010001011100011101011010101011011100111110111110111010110001010111101100101100011110010000000001101110011011100010101000101001011010110011001100110011010000001111000001100101110001100101011011100000001010110110110100 0001111010100011011101111101100101011100010111111101001110101101010110001111010010000010110001010001100101111110111010100101101101011101100011111111001110000110111001101011010100111000111000010001110101110101001000111111110010011010011111100010101010010101110011010001000001110001000011000011010110111110011111011000000011001110101101000011011111010001110000111110110001010110110100100010001011100101 0010001011100111000000111100100011001111001111100010000101101001110110001010110101111010000010110010001100100010101000111010000111100111111001011110100111010000111000001110011001000100111101010110001111111000001110010011100001000111000110010100111110010101010001111000000101000100000001110101111000011011000111100010001111011001011001110111011010101010110001010111101100010110101100000100010101010100 0000101001001001000001110001010110100100111011111001111101010100000101010001010011011010110100001011011100000010000000010001100101101011111111111011010000010010000000010000011001101011000111000010101011011100101000111111110001001111100010111101100110100000011110101001000100111100101101010101110110001011111001011100101001111001011110100001110010111111000010110011001010101011001011000101101000111111 0001111111001110010110010000100000000000100111101001000011000100011101010110001010110101010110101000011011011000000010100000010001010001100000011111000110000110101111101100101001000001010010111000100011111011011111110100110011101011010101101110111110111001000011110011101010011110010110000010000101111011000111111010010111011000101000001011100100110110010010011011100011110000101110100011011100100110 1100000000110001110011000011100011110000110011011101100110010100101110010011100011111100100101001100011011111000001111110110011111010101100000001100000101100110001011010101111011100100100101010011101110001110010111001111111010001000110011110010111010110101010010100001000001100100000101101111010001011111110101101110100110100011000010100110100010100010111000110000110011101101001011110111011010111000 0001001000100010001010101101111010110010101011010001000111010110011001001010110101111110011110110110111110001111000110101111100010011011010101101101111001110011101111100100110011011101101111101111110010010001101010101100110110000001011100100000110101111110010000111001101111100100011011110010111010001100110001011011010100001111111010000111100101010100000001111010011100110001000100010101000001000111 1001011010010101101011000010111110101010011011101100101000010001110001010100111010001110110101101000101111100001010111001111011101101101010000100011001010011110100111000010100001010011000101000000011111100100011100000001011111100111101100001100011010010011010100000111001101001111000001010110000010100001011111000101011101001111000011010101010110010010011010111101111110110100101101001000001000001001 0000011101100001011010011110010001100001111010001101101000100100010101001110101001001001100101010011000111100101000101111110100000001011110111011001010110110000010100101011010110000001011100111110011010010010100010101010101111011011111101100100001110001001000110011011110000010000000000011011001111010101101101101111000111011001010011001011111001111000000100110110001101111100110000111011001101111001 0101000100100000101011011000110110000010000101000101100000100111100011000110100111000110101010001010110110101000101100011100110100111000001101111100101100110110011100101001101100101101101101110000011011101100100011111101111111001010110000001110011001100110010001001111001100010001010010011100000001110111110111110010011110001001000101100110111101000110000100100011001001110101011000101111111001111001
cTrader Algo

【cAlgo】過去のBarsやTicksのロードする【Tips】

4/7/2021

4年以上前の記事です。内容が古くなっている可能性があります。

LoadMoerHistory

もっと昔の価格情報を使いたい

cBotやインジケーター内で最初に読み込まれているより昔の価格情報を使いたい場合はBars.LoadMoreHistoryメソッドで明示的にロードしてあげないといけません。

少し前の情報なら1回BarsプロパティのLoadMoreHistoryメソッドを呼び出すだけでいいのですが、ずーっと前の情報となるとこんな感じでループ回して呼び出すことになります。targetDateTimeに欲しい日時が入ってると思ってください。

var count = 1;
while (Bars.OpenTimes.GetIndexByTime(targetDateTime) == -1 ||  count != 0) {
    count = Bars.LoadMoreHistory();
}

Bars.OpenTimes.GetIndexByTimeメソッドは対象の時間がBarsにないと-1を返すので、Barsにない場合は延々とLoadMoreHistoryを繰り返させるコードです。

ただ条件式がこれだけだと、最後まで読み込んでも対象の時間のデータがなかったときに無限ループになってしまうので、LoadMoreHistory()で読めるデータがなくなった時点でループを抜けるようにしてます。

LoadMoreHistoryメソッドは追加で読み込んだローソク足の本数を返しますので、これが0を返した場合、これ以上のデータはないということになります。

このコード自体は問題ないのですが、ご想像のとおりものすごく時間がかかります。たぶん知らない人が見たらフリーズしてると思うでしょう。自分で使うにしてもフリーズしてるか処理中かわからなくなるのはあまり好ましくないですよね。

 

ロード中であることを示したい

これをやるならチャート上にロード中である旨を表示させておく方が親切でしょう。ついついこんな風に書きたくなってしまうかもしれません。

var count = 1;
while (Bars.OpenTimes.GetIndexByTime(targetDateTime) == -1 || count != 0) {
    count = Bars.LoadMoreHistory();
    Chart.DrawStaticText("loading_text", "NowLoading..." + Bars[0].OpenTime.ToString(), VerticalAlignment.Center, HorizontalAlignment.Center, Color.White);
}
Chart.RemoveObject("loading_text");

1回読み込むたびにチャート上に1本目のバー(読み込んだ一番昔のローソク足)の時間を表示させようとしています。が、実はこれでは何も表示されません

DrawStaticTextで追加したテキストはcTrader側に処理が戻ってからチャート上に表示されるのです。このコードだとロード中は処理を戻さないため、ロード中のテキストは表示されずに、ロード終了後に消されてしまうのです。

なので、読み込むたびにテキストを表示させたり更新させたりしたい場合は、一度読み込むたびに処理を抜ける必要があるのです。非同期メソッドの出番ですね。

 

LoadMoreHistoryAsync

非同期ローディング

非同期でロードさせることのできるこのメソッドは処理が終わり次第実行するコールバックを引数に指定することができるため、これを利用して連続読み込みを行います。

具体的にはこんなメソッドを用意してあげるといいでしょう。

private void LoadMoreBars(DateTime targetDateTime) {
    Chart.DrawStaticText("loading_text", "NowLoading..." + Bars[0].OpenTime.ToString(), VerticalAlignment.Center, HorizontalAlignment.Center, Color.White);
    Bars.LoadMoreHistoryAsync(args => {
        if (Bars.OpenTimes.GetIndexByTime(targetDateTime) == -1) {
            if (args.Count != 0) {
                LoadMoreBars(targetDateTime);
            } else {
                // 全部読んでも欲しいデータがなかった時の処理
            }
        } else {
            // 欲しいデータまで読み終えた後にする処理
        }
    });
}

使い方は欲しい時間を指定してMoreLoadBarsを呼び出してあげるだけです。

動きとしては

1.MoreLoadBarsが呼び出されたら、チャートに状況テキスト表示して非同期でLoadMoreHistoryして処理終える。

2.LoadMoreHistoryが終わり次第、コールバックが呼び出され、目的のデータがあるか確認される

3.データがあるか、全部読み終えてもなければelse内に進む。再読み込みが必要なら再度MoreLoadBarsを呼び出し、1に戻る

この場合は1が終われば一旦cTraderに処理が戻るため、ロード状況を示すStaticTextが表示されるようになります。

 

 

Ticksでも同様だが要注意

Ticksデータが欲しい場合はまず最初にこんな感じでMarketDataプロパティから取得します。

var ticks = MarketData.GetTicks();

これで取得できるのは直近のTicksデータのみですが、あとはBars同様LoadMoreHistoryメソッドで過去にさかのぼって読み込みが可能です。

ただし、Tickは数が多いため、昔のデータが必要な場合は非常に時間がかかります。残念ながら特定期間だけ読み込むということはできず、常に現在のデータから過去にたどっていく形となります。

そしてここが一番要注意なのですが、途中で接続が切断されるとReloadが発生し、最初からやり直しになるようです。

どういうことかというと

var ticks = MarketData.GetTicks();
var count = 1;
while(count != 0) {
    count = ticks.LoadMoreHistory();
}

このコードは無限ループになる可能性があるということです。

実際サーバーにあるTicksをすべて読もうとしたら丸一日近くかかると思われるため、サーバーが安定してないと結構な確率で無限ループになります。

このような理由からLoadMoreHistory()で何年も前のTicksデータを取得するのはやめておいた方がいいでしょう。

 

 

過去のTicksデータを使いたいときはどうするか

「バックテスターのデータをPCに保存して使えばいいじゃん」

というのが公式の回答のようです。

どういうことかというと、バックテスト上のcBotでGetTicksを呼び出すと、そのバックテスト内時間のTicksデータが返ってくるのです。これを利用して

①内部でGetTicksして読み込んだTicksデータをローカルに保存するcBot作る。

②そのデータ保存用cBotをTicksデータが欲しい期間を指定し、バックテストで動かす。→ファイルが出来上がる。

③別のcBotから保存されたファイルを呼んで使う。

ということですね。言われてみれば確かにこうすれば可能ですが、ただ、配布するプログラムではちょっと使いにく方法です。ユーザー側でTicksデータ保存作業もやってもらう必要が出てきますし。

やっぱり特定期間のTicksデータだけ取得するメソッドが欲しいなぁ・・・


まだコメントはありません

新しいコメント

コメントは承認後に公開されます。承認まで次のコメントは投稿できません。

cTrader's Life

© 2025 ajinori